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碼的控制字元就 不能通過郵件傳送。這樣用途就受到了很大的限制,比如二進位製流的每個位元組不可能全部是可見字元,所以就傳送不了。最好的方法就是在不改變傳統協...