----Base64编码转换----

//----Base64编码转换----//
function DecodeBase64(s: string): String;
var
  s1,s2,s3: integer;
  t,v: string;
  Encoding: char;
  hex,step: integer;
  a1: array[1..4] of byte;
  b1: array[1..3] of byte;
  j:  integer;
  byte_ptr,real_bytes: integer;
begin
  s1:=Pos('=?',s);
  s2:= 1 ;
  hex:= 0 ;
  if s1>0 then
  begin
    for s2:=Length(s)-1 downto 1 do
    begin
      if Copy(s,s2,2)='?=' then Break;
    end;
  end;
  if (s1=0) or (s2=1) then
  begin
    Result:=s;
    Exit;
  end;
  t:=Copy(s,s1+2,s2-2-s1);
  s3:=Pos('?',t);
  Delete(t,1,s3);
  if(t='')then
  begin
    Result:= s;
    Exit ;
  end ;
  Encoding:=t[1];
  Delete(t,1,2);
  v:='';
  step:=0;
  case Encoding of
  'Q':
    while t<>'' do
    begin
      case step of
      0:
        begin
          case t[1] of
          '_': v:=v+' ';
          '=': step:=1;
          else v:=v+t[1];
          end;
        end;
      1:
        begin
          if t[1]<='9' then hex:=(Ord(t[1])-Ord('0'))*16
          else hex:=(Ord(t[1])-55)*16;
          step:=2;
        end;
      2:
        begin
          if t[1]<='9' then hex:=hex+(Ord(t[1])-Ord('0'))
          else hex:=hex+Ord(t[1])-55;
          v:=v+Chr(hex);
          step:=0;
        end;
      end;
      Delete(t,1,1);
    end;
  'B':
    begin
      byte_ptr:=0;
      for j:=1 to Length(t) do
      begin
              Inc(byte_ptr);
              case t[j] of
              'A'..'Z': a1[byte_ptr]:=Ord(t[j])-65;
              'a'..'z': a1[byte_ptr]:=Ord(t[j])-71;
              '0'..'9': a1[byte_ptr]:=Ord(t[j])+4;
              '+': a1[byte_ptr]:=62;
              '/': a1[byte_ptr]:=63;
              '=': a1[byte_ptr]:=64;
              end;
              if byte_ptr=4 then
              begin
                      byte_ptr:=0;
                      real_bytes:=3;
                      if a1[1]=64 then real_bytes:=0;
                      if a1[3]=64 then
                      begin
                              a1[3]:=0;
                              a1[4]:=0;
                              real_bytes:=1;
                      end;
                      if a1[4]=64 then
                      begin
                              a1[4]:=0;
                              real_bytes:=2;
                      end;
                      b1[1]:=a1[1]*4+(a1[2] div 16);
                      b1[2]:=(a1[2] mod 16)*16+(a1[3]div 4);
                      b1[3]:=(a1[3] mod 4)*64 +a1[4];
                      if(real_bytes>0)then
                        v:= v + chr(b1[1]) ;
                      if(real_bytes>1)then
                        v:= v + chr(b1[2]) ;
                      if(real_bytes>2)then
                        v:= v + chr(b1[3]) ;
              end;
      end;
    end;
  end;
  Result := v;
end; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值