C語言實現Base64編碼 解碼

2021-09-26 21:17:15 字數 3287 閱讀 1078

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...