base64編解碼

比如有數據:0x30 對0x30編碼: 2)

BASE64編碼是一種常用的將二進制數據轉換為可列印字元的編碼。與HEX顯示相比,它占用的空間較小。BASE64編碼在RFC 3548 (參見擴展閱讀)中定義。
1、base64編解碼原理
將數據編碼成BASE64編碼時,以3位元組數據為一組,轉換為24bit的二進制數,將24bit的二進制數分成四組,每組6bit。對於每一組,得到一個數字:0-63。然後根據這個數字查表即得到結果。表如下:
Value Char Value Char Value Char Value Char
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

比如有數據:0x30 0x82 0x02
編碼過程如下:
1)得到16進制數據: 30 82 02
2)得到二進制數據: 00110000 10000010 00000010
3)每6bit分組: 001100 001000 001000 000010
4)得到數字: 12 8 8 2
5)根據查表得到結果 : M I I C
BASE64填充:在不夠的情況下在右邊加0。
有三種情況:
1) 輸入數據比特數是24的整數倍(輸入位元組為3位元組整數倍),則無填充;
2) 輸入數據最後編碼的是1個位元組(輸入數據位元組數除3餘1),即8比特,則需要填充2個"==",因為要補齊6比特,需要加2個00;
3)輸入數據最後編碼是2個位元組(輸入數據位元組數除3餘2),則需要填充1個"=",因為補齊6比特,需要加一個00。
舉例如下:
對0x30編碼:
1) 0x30的二進制為:00110000
2) 分組為:001100 00
3) 填充2個00:001100 000000
4) 得到數字:12 0
5) 查表得到的編碼為MA,另外加上兩個==
所以最終編碼為:MA==
base64解碼是其編碼過程的逆過程。解碼時,將base64編碼根據表展開,根據有幾個等號去掉結尾的幾個00,然後每8比特恢復即可。
2、base64函式
Java:
使用Apache Commons提供的Base64類(參見擴展閱讀)。
openssl中用於base64編解碼的函式主要有:
1) 編碼函式
Ø EVP_EncodeInit函式
原型:void EVP_EncodeInit(EVP_ENCODE_CTX *ctx);
功能:該函式初始化一個用來進行base64編碼的結構,事實上,該函式只是簡單設定了結構裡面幾個常量的長度。
參數:
ctx:base64設備上下文
Ø EVP_EncodeUpdate函式
原型:void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl,unsigned char *in,int INL);
功能:該函式將參數in裡面的inl自己數據拷貝到結構體ctx裡面,如果結構體裡面有數據,就同時將結構體裡面的數據進行BASE64編碼並輸出到參數out指向的快取裡面,輸出數據的長度保存在outl裡面。注意,在第一次調用本函式的時候,雖然往結構體裡面拷貝數據了,但是結構體ctx裡面開始是沒有輸入數據存在並且輸入數據長度不超出ctx內部存儲數據的最長限制,就不會有任何數據被進行BASE64編碼,也就是說,不會有任何數據輸出;但是如果輸入數據長度比內部存儲的數據長,那么就會輸出部分經過BASE64編碼的數據。數據輸出總是在下一層輸入前完成的。
參數:
ctx:base64設備上下文。
out:存放編碼後數據緩衝區
outl:編碼後的數據長度。
in:編碼前的數據。
inl:編碼前的數據長度。
Ø EVP_EncodeFinal函式
原型:void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl);
功能:該函式將結構體ctx裡面剩餘數據進行BASE64編碼並寫入到參數out裡面去,輸出數據的長度保存在outl裡面。
參數:
ctx:base64設備上下文。
out:存放編碼後的數據。
outl:編碼後的數據長度。
Ø EVP_EncodeBlock函式
原型:int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n);
功能:該函式將參數f裡面的字元串裡面的n個位元組的字元串進行BASE64編碼並輸出到參數t裡面。返回數據的位元組長度。事實上,在函式EVP_EncodeUpdate和EVP_EncodeFinal裡面就調用了該函式完成BASE64編碼功能。
參數:
t:接收編碼後的數據緩衝區。
f:編碼前的數據。
n:編碼前的數據長度。
2) 解碼函式
Ø EVP_DecodeInit函式
原型:void EVP_DecodeInit(EVP_ENCODE_CTX *ctx);
功能:該函式初始化一個用來進行BASE64解碼的數據結構。
參數:
ctx:base64設備上下文。
Ø EVP_DecodeUpdate函式
原型:int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl,unsigned char *in, int inl);
功能:該函式將參數in裡面inl位元組的數據拷貝到結構體ctx裡面。如果結構體裡面已經有數據,那么這些數據就會先進行BASE64解碼,然後輸出到參數out指向的記憶體中,輸出的位元組數保存在參數outl裡面。輸入數據為滿行的數據時,返回為1;如果輸入數據是最後一行數據的時候,返回0;返回-1則表明出錯了。
參數:
ctx:base64設備上下文。
out:存放解碼後的數據緩衝區。
outl:解碼後的數據長度。
in:解碼前的數據。
inl:解碼前的數據長度。
Ø EVP_DecodeFinal函式
原型:int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl);
功能:該函式將結構體ctx裡面剩餘的數據進行BASE64解碼並輸出到參數out指向的記憶體中,輸出數據長度為outl位元組。成功返回1,否則返回-1。
參數:
ctx:base64設備上下文。
out:解碼後的數據。
outl:解碼後的數據長度。
Ø EVP_DecodeBlock函式
原型:int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n);
功能:該函式將字元串f中的n位元組數據進行BASE64解碼,並輸出到t指向的記憶體中,輸出數據長度為outl。成功返回解碼的數據長度,返回返回-1。
參數:
t:接收解碼後的數據緩衝區。
f:解碼前的數據。
n:解碼前的數據長度。

相關詞條

相關搜尋

熱門詞條

聯絡我們