bse64是一種以64個可列印字元對二進位制資料進行編碼的編碼演算法。base64在對資料進行編碼時以三個8位字元型資料為一組,取這三個字元型資料的ascii碼,然後以6位為一組組成4個新的資料,這4個新的資料有6位,所以它的最大值為2^6=64。我們以4個6位資料的十進位制數從base64表中得到最終編碼後的字元。
base64 編碼表
value
char
value
char
value
char
value
char 0a
16q32g
48w1b
17r33h
49x2c
18s34i
50y3d
19t35j
51z4e
20u36k
5205f
21v37l
5316g
22w38m
5427h
23x39n
5538i
24y40o
5649j
25z41p
57510k
26a42q
58611l
27b43r
59712m
28c44s
60813n
29d45t
61914o
30e46u
62+15p
31f47v
63/由於base64編碼是將編碼前的3*8位資料,分解成4個6位的資料,所以經過base64編碼後的字串長度是4的倍數。但往往我們進行編碼的資料長度並不是3的倍數,這就造成了「編碼」後的位數不為4的倍數,比如brisk共5×8=40位,以6位為一組可以分為7組,這樣「編碼」後就有7個字元,但base64編碼後的字元長度應該是4的倍數,顯然這裡就出問題了,那麼怎麼辦呢?前面的不可以拋棄掉,所以就只有「追加」了,所以brisk經過base64編碼後的長度應該是8個字元,而第8個編碼後的字元是'=',再比如對單個字元a進行base64編碼,由於它的長度不是3的倍數,以3個位元組為一組它只能分一組,再以6位為一位它只能分兩組,所以經過「編碼」後它的長度是2,但base64編碼後的個數應該是4的倍數,所以它的長度應該是4,所以在後面補上兩個『=』,由於乙個數求餘3後有三個不同的結果,0、1、2,所以在對乙個資料進行base64進行編碼後它的長度為:
(1)當進行編碼的資料長度是3的倍數時,len=strlen(str_in)/3*4;
(2)當進行編碼的資料長度不是3的倍數時,len=(strlen(str_in)/3+1)*4;
我們以brisk這個例子來說明一下base64編碼的過程。首先我們以3個字元為一組將brisk進行分組,brisk被氛圍兩組:bri 和 sk;然後我們取出這兩個分組中每個位元組的ascii碼,b:66 r:114 i:105 s:115 k:107。它們對應的二進位制數為 b:01000010 r:01110010 i:01101001 s:01110011 k:01101011;
第一組,我們以6位為一組對每乙個3位元組分組進行再分組就變成了010000 100111 001001 101001。所對應的十進位制數是16 39 9 41,對應base64表中的結果是 q n j p;
第二組,011100 110110 101100(不夠補0),所以對應的十進位制數是 28 54 44,對應base64表中的結果是 c 2 s,最終結果為qnjpc2s=(因為第二組「編碼」後只有三個位元組)。
解碼的過程是乙個逆過程,我們將經過編碼後的字元按4個字元為一組,然後對照base64表得到相應的十進位制數,再將其通過拆分和組合,組成3個8位資料,這個資料就是解碼後的資料,下面給乙個c語言實現編碼和解碼的**。
1、base64.h
/*base64.h*/
#ifndef _base64_h
#define _base64_h
#include #include unsigned char *base64_encode(unsigned char *str);
unsigned char *bae64_decode(unsigned char *code);
#endif
2、base64.c
/*base64.c*/
#include "base64.h"
unsigned char *base64_encode(unsigned char *str)
switch(str_len % 3)
return res;
}
unsigned char *base64_decode(unsigned char *code)
; long len;
long str_len;
unsigned char *res;
int i,j;
//計算解碼後的字串長度
len=strlen(code);
//判斷編碼後的字串後是否有=
if(strstr(code,"=="))
str_len=len/4*3-2;
else if(strstr(code,"="))
str_len=len/4*3-1;
else
str_len=len/4*3;
res=malloc(sizeof(unsigned char)*str_len+1);
res[str_len]='\0';
//以4個字元為一位進行解碼
for(i=0,j=0;i < len-2;j+=3,i+=4)
return res;
}
3、test.c
/*乙個測試程式*/
#include "base64.h"
#include #include int main(int argc,char **ar**)
else
free(buf);
return 0;
}
4、執行編譯
編譯
gcc -o test test.c base64.c
./test a123456
yteymzq1ng==
./test -d yteymzq1ng==
a123456
c語言實現base64編碼/解碼介紹到此結束。 C語言實現Base64編碼 解碼
bse64是一種以64個可列印字元對二進位制資料進行編碼的編碼演算法。base64在對資料進行編碼時以三個8位字元型資料為一組,取這三個字元型資料的ascii碼,然後以6位為一組組成4個新的資料,這4個新的資料有6位,所以它的最大值為2 6 64。我們以4個6位資料的十進位制數從base64表中得到...
Base64 編譯碼C語言實現
本文繼續前文 http blog.csdn.net hegch archive 2009 05 01 4141125.aspx 前文講述了如何實現base64的編碼,本文給出解碼的 這裡給出的 是整個完整的編碼和解碼,將加密之後的串解密得到原來的字串。具體 如下 這裡新增了兩個方法find pos和...
base64編碼 解碼
ps base64是一種資料編碼方式,目的是讓資料符合傳輸協議的要求,有些人誤用它進行資料加密 base64編碼 nsstring base64encodedstringwithstring nsstring string base64解碼 nsstring base64decodedstringw...