词条 | base64编解码 |
释义 | 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:解码前的数据长度。 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。