BASE64测试

来源:互联网 发布:张爱玲 红楼梦魇知乎 编辑:程序博客网 时间:2024/06/04 00:21
  1. function GetSizeCoder3To4(InputCount: Integer): Integer; inline;  
  2. begin  
  3.   Result := (InputCount+2div 3 * 4  
  4. end;  
  5.   
  6. procedure Base64Encode(InputCount: Integer; const Input: Pointer; Output: Pointer); assembler;  
  7. asm  
  8.   //感谢 DelphiGuy 于 2010-10-08 17:27:37 给出的提醒,防止 "ECX and EDX = 0" 的情况发生异常  
  9.   { 
  10.   TEST ECX, EDX             // Input = Nil or Output = Nil ? 
  11.   jz   @ret                 // if (Input = Nil) or (Output = Nil) then Exit; 
  12.   }  
  13.   TEST ECX, ECX  
  14.   jz   @ret  
  15.   TEST EDX, EDX  
  16.   jz   @ret  
  17.   
  18.   push esi                  //saving Registers  
  19.   push edi  
  20.   push ebx  
  21.   push ebp  
  22.   
  23.   lea  ebp, @codetable      //load B64-CodeTable-8bit  
  24.   
  25.   mov  esi, edx             //ESI := Input  
  26.   mov  edi, ecx             //EDI := Output  
  27.   
  28.   xor  edx, edx  
  29.   mov  ecx, 3  
  30.   div  ecx                  //EAX := InputCount div 3, EDX := InputCount mod 3  
  31.   
  32.   push edx  
  33.   xor ebx,ebx               //Clear EBX  
  34.   dec esi  
  35.   
  36.   test eax, eax             //InputCount div 3 = 0 ?  
  37.   jz   @next                //if InputCount div 3 = 0 then Do Next  with (InputCount mod 3) Bytes  
  38.   mov  ecx, [esi+1]         //ECX := 0x44332211 , Bits = 44444444 33333333 22222222 11111111  
  39.   bswap ecx                 //ECX := 0x11223344 , Bits = 11111111 22222222 33333333 44444444  
  40.   
  41.   mov  bl, ch               //BL := 0x33 , Bits = 33333333, valid-Bits: 00333333  
  42.   mov  dh,[ebp + ebx]       //DH := CodeTable[Bits: **333333]  
  43.   
  44.   shr  ecx, 14              //Prior 6-bits, Bits = 00000000 00000011 11111122 22222233  
  45.   mov  bl, cl               //BL := Bits:22222233, valid-Bits: 00222233  
  46.   mov  dl,[ebp + ebx]       //DL := CodeTable[Bits: **222233]  
  47.   mov  [edi+2], dx          //Output[2] := DX  
  48.   
  49.   shr  ecx, 6               //Prior 6-bits, Bits = 0000000 00000000 00001111 11112222  
  50.   mov  bl, cl               //BL := Bits:11112222, valid-Bits: 00112222  
  51.   mov  dh, [ebp + ebx]      //DH := CodeTable[Bits: **112222]  
  52.   
  53.   shr  ecx, 6               //First 6-bits, Bits = 00000000 00000000 00000000 00111111  
  54.   mov  bl, cl               //BL := Bits:00111111  
  55.   mov  dl,[ebp + ebx]       //DL := CodeTable[Bits: **111111]  
  56.   mov  [edi], dx            //Output[0] := DX  
  57.   
  58.   add  edi,4                //Inc(Output, 4)  
  59.   add  esi,3                //Inc(Input, 3)  
  60.   
  61.   Dec  EAX                  //Dec EAX  
  62.   jz @next                  //if EAX = 0 then Goto @Next  
  63.   
  64. @loop:  
  65.   mov  ecx, [esi]           //ECX := 0x66554433 , Bits = 66666666 55555555 44444444 33333333  
  66.   bswap ecx                 //ECX := 0x33445566 , Bits = 33333333 44444444 55555555 66666666  
  67.   
  68.   mov  bl, cl               //BL := 0x66 , Bits = 66666666, valid-Bits: 00666666  
  69.   mov  dh, [ebp + ebx]      //DH := CodeTable[Bits: **666666]  
  70.   
  71.   shr  ecx, 6               //Prior 6-bits, Bits = 00000033 33333344 44444455 55555566  
  72.   mov  bl, cl               //BL := Bits:55555566, valid-Bits: 00555566  
  73.   mov  dl,[ebp + ebx]       //DL := CodeTable[Bits: **555566]  
  74.   mov  [edi+2], dx          //Output[2] := DX  
  75.   
  76.   shr  ecx, 6               //Prior 6-bits, Bits = 0000000 00003333 33334444 44445555  
  77.   mov  bl, cl               //BL := Bits:44445555, valid-Bits: 00445555  
  78.   mov  dh,[ebp + ebx]       //DH := CodeTable[Bits: **445555]  
  79.   
  80.   shr  ecx, 6               //First 6-bits, Bits = 00000000 00000000 00333333 33444444  
  81.   mov  bl, cl               //BL := Bits:33444444, valid-Bits: 00444444  
  82.   mov  dl,[ebp + ebx]       //DL := CodeTable[Bits: **444444]  
  83.   mov  [edi], dx            //Output[0] := DX  
  84.   
  85.   add  edi,4                //Inc(Output, 4)  
  86.   add  esi,3                //Inc(Input, 3)  
  87.   
  88.   Dec  EAX  
  89.   jnz  @loop                //Dec ECX, if ECX <> 0 then Goto @Loop  
  90.   
  91. @next:  
  92.   pop  edx  
  93.   
  94.   dec  edx                  // EDX := (InputCount mod 3) - 1  
  95.   jz   @OneByte             // if EDX = 0 then GOTO One-Byte  
  96.   jns  @TwoBytes            // if EDX <> -1 then GOTO Two-Bytes  
  97.   
  98.   pop ebp  
  99.   pop ebx  
  100.   pop edi  
  101.   pop esi  
  102.   ret  
  103.   
  104.    //Last two-Bytes  
  105. @TwoBytes:  
  106.   
  107.   mov  ax, [esi + 1]        //Bits: 22222222 11111111  
  108.   xchg al, ah               //Bits: 11111111 22222222  
  109.   lea eax, [eax * 4]        //shl ecx, 2 ,Bits: 00000000 00000011 11111122 22222200  
  110.   mov  bl, al               //Bits: 22222200, valid-Bits: 00222200  
  111.   mov  dh, [ebp + ebx]      //DH := CodeTable[Bits: **222200]  
  112.   
  113.   shr  eax, 6               //Bits: 00000000 00000000 00001111 11112222  
  114.   mov  bl, al               //Bits: 11112222, valid-Bits: 00112222  
  115.   mov  dl, [ebp + ebx]      //DL := CodeTable[Bits: **112222]  
  116.   mov  [edi + 1], dx  
  117.   
  118.   shr  eax, 6               //Bits: 00000000 00000000 00000000 00111111  
  119.   mov  dl, [ebp + eax]      //DL := CodeTable[Bits: 00111111]  
  120.   mov  [edi], dl  
  121.   
  122.   mov  Byte ptr [edi + 3], 61 //'='  
  123.   
  124.   pop ebp  
  125.   pop ebx  
  126.   pop edi  
  127.   pop esi  
  128.   ret  
  129.   
  130.   //Last one-Byte  
  131. @OneByte:  
  132.   
  133.   mov  al, [esi + 1]        // Bits: 11111111  
  134.   lea  ebx, [eax * 8]       // EBX := EAX SHL 3, Bits: 00000000 00000000 00000111 11111000  
  135.   and  ebx, $18             // Bits: 00000000 00000000 00000000 00011000  
  136.   mov  dh, [ebp + ebx * 2]  // Bits: 00000000 00000000 00000000 00110000  
  137.                             // DH := CodeTable[Bits: **110000]  
  138.   shr  eax, 2               // Bits: 00000000 00000000 00000000 00111111  
  139.   mov  dl, [ebp + eax]      // DL := CodeTable[Bits: **111111]  
  140.   mov  [edi], dx  
  141.   
  142.   mov  Byte ptr [edi + 2], 61 //'='  
  143.   mov  Byte ptr [edi + 3], 61 //'='  
  144.   
  145.   pop ebp  
  146.   pop ebx  
  147.   pop edi  
  148.   pop esi  
  149. @ret:  
  150.   ret  
  151.     
  152. @CodeTable:  
  153.   //Bits: 00******  
  154.   db  6566676869707172  
  155.   db  7374757677787980  
  156.   db  8182838485868788  
  157.   db  8990979899,100,101,102  
  158.   db 103,104,105,106,107,108,109,110  
  159.   db 111,112,113,114,115,116,117,118  
  160.   db 119,120,121,12248495051  
  161.   db  5253545556574347  
  162.   //Bits: 01******  
  163.   db  6566676869707172  
  164.   db  7374757677787980  
  165.   db  8182838485868788  
  166.   db  8990979899,100,101,102  
  167.   db 103,104,105,106,107,108,109,110  
  168.   db 111,112,113,114,115,116,117,118  
  169.   db 119,120,121,12248495051  
  170.   db  5253545556574347  
  171.   //Bits: 10******  
  172.   db  6566676869707172  
  173.   db  7374757677787980  
  174.   db  8182838485868788  
  175.   db  8990979899,100,101,102  
  176.   db 103,104,105,106,107,108,109,110  
  177.   db 111,112,113,114,115,116,117,118  
  178.   db 119,120,121,12248495051  
  179.   db  5253545556574347  
  180.   //Bits: 11******  
  181.   db  6566676869707172  
  182.   db  7374757677787980  
  183.   db  8182838485868688  
  184.   db  8990979899,100,101,102  
  185.   db 103,104,105,106,107,108,109,110  
  186.   db 111,112,113,114,115,116,117,118  
  187.   db 119,120,121,12248495051  
  188.   db  5253545556574347  
  189. end;  

[delphi] view plain copy
  1. //测试代码  
  2. procedure TForm1.Button1Click(Sender: TObject);  
  3. var  
  4.   StrSrc, StrDst: AnsiString;  
  5. begin  
  6.   StrSrc := '测试一下Base64编码,看看结果是什么...';  
  7.   SetLength(StrDst, GetSizeCoder3To4(Length(StrSrc)));  
  8.   Base64Encode(Length(StrSrc), Pointer(StrSrc), Pointer(StrDst));  
  9.   MessageBox(GetActiveWindow,PAnsiChar(StrDst),'Base64编码输出',MB_OK or MB_ICONINFORMATION);  
  10. end;  
原创粉丝点击