BASE64 編碼原理

2021-06-13 00:38:18 字數 2712 閱讀 5967

unit ubase64;

{ 編碼原理:

將3個位元組轉換成4個位元組((3 x 8)=24=(4x6)),先讀入3個位元組,

每讀乙個位元組,左移8位,再右移四次,每次6位,這樣就有4個

位元組了。

解碼原理:

將4個位元組轉換成3個位元組,先讀入4個6位(用或運算),每次左

移6位,再右移3次,每次8位,這樣就還原了。

補"="符:

base64將3個位元組轉變為4個位元組,因此,編碼後的**量(以

位元組為單位,下同)約比編碼前的**量多了1/3。如果**量

正好是3的整數倍,那麼恰好多了1/3。但如果不是呢?這個時

候「=」終於派上用場啦,當**量不是3的整數倍時,**量/3的

餘數自然就是2或者1。轉換的時候,結果不夠6位的用0來補上

相應的位置,之後再在6位的前面補兩個0。轉換完空出的結果

就用就用「=」來補位,總之要保證最後編碼出來得位元組數是4的

倍數。例子:

1、當字串字元個數為3的倍數時;比如字串「abc」,其在計算機記憶體中的

十六進製制表示為$41、$42、$43,十進位制表示為「65」「66」「67」;二進位制表示

為01000001  01000010  01000011   將這三個二進位制數依次取6bit

,010000/01 0100/0010  01/000011  就轉換成了:  010000  

010100  001001  000011  將這四個二進位制數轉換成十六制數為:

$10,$14,$9,$3,十進位制數字為16,20,9,3。對照上面的碼表,分別查

找出對應的字元為q,u,j,d。也是就說字串「abc」經過base64編碼後得

出「qujd」。  這是最簡單的情況,即ascii碼字元數剛好可以被3整除。接

著繼續討論餘數為2、為1的情況。  

2、當餘數為2時,比如字串「ce」,其在記憶體中十六進製制表示為$63,$65;十

進製表示表示99,101;二進位制表示為  01100011 01100101 依次取6bit

011000/11 0110/0101  這時,第3個字元不足6位,在後面補零,也就

是0101變成010100。轉換結果為  011000 110110 010100  這3個二進

制數轉換成十六制數為$18,$36,$14;十進位制數字為24,54,20。對照碼表

得出結果「y2u」。編碼後的字元個數不足4位,用「=」填充,最後編碼得出「y2u=」。

3、當餘數為1時,比如字串「{」,其在記憶體中的十六進製制表示為$7b,十進位制為

123,二進位制位表示為  01111011 依次取6bit 011110/11   補0後為

011110/110000  轉換結果為011110和110000  這兩個二進位制數轉換成

十六進製制數為$1e,$30,十進位制數為30,48。對照碼表得出結果為「ew」,補上

「=」,最後編碼得出「ew= =」。  解碼也很簡單,是編碼的逆過程,即將每

個字元對照碼表換算成6bit的二進位制數,然後重組起來,按8位進行擷取,得出原碼。

根據上述原始長度<=3的,轉碼後長度為4即為 len/3 向上取整後*4

當長度3$ff) and (temp[3]= $ff) then

begin

output^[optr+1]:= (temp[1] shl 4) or (temp[2] shr 2);

result:= optr+2;

inc(optr)

endelse if (temp[2]<> $ff) then

begin

output^[optr+1]:= (temp[1] shl 4) or (temp[2] shr 2);

output^[optr+2]:= (temp[2] shl 6) or temp[3];

result:= optr+3;

inc(optr,2);

end;

inc(optr);

end;

end;

function base64decodestr(const value: string): string;

begin

setlength(result,(length(value) div 4) * 3);

setlength(result,base64decode(@value[1],@result[1],length(value)));

end;

function encodebase64(const srcstr:string;var base64deststr:string):boolean;

begin

result := true;

trybase64deststr := base64encodestr(srcstr);

except

result := false;

end;

end;

function decodebase64(const base64str:string;var deststr:string):boolean;

begin

result := true;

trydeststr := base64decodestr(base64str);

except

result := false;

end;

end;

end.

Base64編碼原理

一 base64編碼原理 1 base64編碼原理簡單介紹 base64要求把每三個8bit的位元組轉換為四個6bit的位元組 3 8 4 6 24 然後把6bit再添兩位高位0,組成四個8bit的位元組,也就是說,轉換後的字串理論上將要比原來的長1 3。編碼原理如下所示 1 base64的編碼都是...

Base64編碼原理

所謂base64,就是說選出64個字元 小寫字母a z 大寫字母a z 數字0 9 符號 再加上作為墊字的 實際上是65個字元 作為乙個基本字符集。然後,其他所有符號都轉換成這個字符集中的字元。具體來說,轉換方式可以分為四步。第一步,將每三個位元組作為一組,一共是24個二進位制位。第二步,將這24個...

base64 編碼原理

一.base64編碼由來 為什麼會有base64編碼呢?因為有些網路傳送渠道並不支援所有的位元組,例如傳統的郵件只支援可見字元的傳送,像ascii碼的控制字元就 不能通過郵件傳送。這樣用途就受到了很大的限制,比如二進位製流的每個位元組不可能全部是可見字元,所以就傳送不了。最好的方法就是在不改變傳統協...