如何在C中使用base 64编码(解码)?

如何在C中使用base 64编码(解码)?

我在一个无符号字符变量中有二进制数据。我需要将它们转换成c+中的PEMBase 64,我查看了OpenSSL库,但是找不到任何函数。有人知道吗?



MMMHUHU
浏览 619回答 3
3回答

元芳怎么了

我用的是:#include&nbsp;<stdint.h>#include&nbsp;<stdlib.h>static&nbsp;char&nbsp;encoding_table[]&nbsp;=&nbsp;{'A',&nbsp;'B',&nbsp;'C',&nbsp;'D',&nbsp;'E',&nbsp;'F',&nbsp;'G',&nbsp;'H', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'I',&nbsp;'J',&nbsp;'K',&nbsp;'L',&nbsp;'M',&nbsp;'N',&nbsp;'O',&nbsp;'P', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Q',&nbsp;'R',&nbsp;'S',&nbsp;'T',&nbsp;'U',&nbsp;'V',&nbsp;'W',&nbsp;'X', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Y',&nbsp;'Z',&nbsp;'a',&nbsp;'b',&nbsp;'c',&nbsp;'d',&nbsp;'e',&nbsp;'f', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'g',&nbsp;'h',&nbsp;'i',&nbsp;'j',&nbsp;'k',&nbsp;'l',&nbsp;'m',&nbsp;'n', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'o',&nbsp;'p',&nbsp;'q',&nbsp;'r',&nbsp;'s',&nbsp;'t',&nbsp;'u',&nbsp;'v', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'w',&nbsp;'x',&nbsp;'y',&nbsp;'z',&nbsp;'0',&nbsp;'1',&nbsp;'2',&nbsp;'3', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'4',&nbsp;'5',&nbsp;'6',&nbsp;'7',&nbsp;'8',&nbsp;'9',&nbsp;'+',&nbsp;'/'};static&nbsp;char&nbsp;*decoding_table&nbsp;=&nbsp;NULL;static&nbsp;int&nbsp;mod_table[]&nbsp;=&nbsp;{0,&nbsp;2,&nbsp;1};char&nbsp;*base64_encode(const&nbsp;unsigned&nbsp;char&nbsp;*data, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;input_length, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;*output_length)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;*output_length&nbsp;=&nbsp;4&nbsp;*&nbsp;((input_length&nbsp;+&nbsp;2)&nbsp;/&nbsp;3); &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*encoded_data&nbsp;=&nbsp;malloc(*output_length); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(encoded_data&nbsp;==&nbsp;NULL)&nbsp;return&nbsp;NULL; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0,&nbsp;j&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;input_length;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;octet_a&nbsp;=&nbsp;i&nbsp;<&nbsp;input_length&nbsp;?&nbsp;(unsigned&nbsp;char)data[i++]&nbsp;:&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;octet_b&nbsp;=&nbsp;i&nbsp;<&nbsp;input_length&nbsp;?&nbsp;(unsigned&nbsp;char)data[i++]&nbsp;:&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;octet_c&nbsp;=&nbsp;i&nbsp;<&nbsp;input_length&nbsp;?&nbsp;(unsigned&nbsp;char)data[i++]&nbsp;:&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;triple&nbsp;=&nbsp;(octet_a&nbsp;<<&nbsp;0x10)&nbsp;+&nbsp;(octet_b&nbsp;<<&nbsp;0x08)&nbsp;+&nbsp;octet_c; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encoded_data[j++]&nbsp;=&nbsp;encoding_table[(triple&nbsp;>>&nbsp;3&nbsp;*&nbsp;6)&nbsp;&&nbsp;0x3F]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encoded_data[j++]&nbsp;=&nbsp;encoding_table[(triple&nbsp;>>&nbsp;2&nbsp;*&nbsp;6)&nbsp;&&nbsp;0x3F]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encoded_data[j++]&nbsp;=&nbsp;encoding_table[(triple&nbsp;>>&nbsp;1&nbsp;*&nbsp;6)&nbsp;&&nbsp;0x3F]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encoded_data[j++]&nbsp;=&nbsp;encoding_table[(triple&nbsp;>>&nbsp;0&nbsp;*&nbsp;6)&nbsp;&&nbsp;0x3F]; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;mod_table[input_length&nbsp;%&nbsp;3];&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encoded_data[*output_length&nbsp;-&nbsp;1&nbsp;-&nbsp;i]&nbsp;=&nbsp;'='; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;encoded_data;}unsigned&nbsp;char&nbsp;*base64_decode(const&nbsp;char&nbsp;*data, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;input_length, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;*output_length)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(decoding_table&nbsp;==&nbsp;NULL)&nbsp;build_decoding_table(); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(input_length&nbsp;%&nbsp;4&nbsp;!=&nbsp;0)&nbsp;return&nbsp;NULL; &nbsp;&nbsp;&nbsp;&nbsp;*output_length&nbsp;=&nbsp;input_length&nbsp;/&nbsp;4&nbsp;*&nbsp;3; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(data[input_length&nbsp;-&nbsp;1]&nbsp;==&nbsp;'=')&nbsp;(*output_length)--; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(data[input_length&nbsp;-&nbsp;2]&nbsp;==&nbsp;'=')&nbsp;(*output_length)--; &nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;*decoded_data&nbsp;=&nbsp;malloc(*output_length); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(decoded_data&nbsp;==&nbsp;NULL)&nbsp;return&nbsp;NULL; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0,&nbsp;j&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;input_length;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;sextet_a&nbsp;=&nbsp;data[i]&nbsp;==&nbsp;'='&nbsp;?&nbsp;0&nbsp;&&nbsp;i++&nbsp;:&nbsp;decoding_table[data[i++]]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;sextet_b&nbsp;=&nbsp;data[i]&nbsp;==&nbsp;'='&nbsp;?&nbsp;0&nbsp;&&nbsp;i++&nbsp;:&nbsp;decoding_table[data[i++]]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;sextet_c&nbsp;=&nbsp;data[i]&nbsp;==&nbsp;'='&nbsp;?&nbsp;0&nbsp;&&nbsp;i++&nbsp;:&nbsp;decoding_table[data[i++]]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;sextet_d&nbsp;=&nbsp;data[i]&nbsp;==&nbsp;'='&nbsp;?&nbsp;0&nbsp;&&nbsp;i++&nbsp;:&nbsp;decoding_table[data[i++]]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;triple&nbsp;=&nbsp;(sextet_a&nbsp;<<&nbsp;3&nbsp;*&nbsp;6) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;(sextet_b&nbsp;<<&nbsp;2&nbsp;*&nbsp;6) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;(sextet_c&nbsp;<<&nbsp;1&nbsp;*&nbsp;6) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;(sextet_d&nbsp;<<&nbsp;0&nbsp;*&nbsp;6); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(j&nbsp;<&nbsp;*output_length)&nbsp;decoded_data[j++]&nbsp;=&nbsp;(triple&nbsp;>>&nbsp;2&nbsp;*&nbsp;8)&nbsp;&&nbsp;0xFF; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(j&nbsp;<&nbsp;*output_length)&nbsp;decoded_data[j++]&nbsp;=&nbsp;(triple&nbsp;>>&nbsp;1&nbsp;*&nbsp;8)&nbsp;&&nbsp;0xFF; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(j&nbsp;<&nbsp;*output_length)&nbsp;decoded_data[j++]&nbsp;=&nbsp;(triple&nbsp;>>&nbsp;0&nbsp;*&nbsp;8)&nbsp;&&nbsp;0xFF; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;decoded_data;}void&nbsp;build_decoding_table()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;decoding_table&nbsp;=&nbsp;malloc(256); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;64;&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decoding_table[(unsigned&nbsp;char)&nbsp;encoding_table[i]]&nbsp;=&nbsp;i;}void&nbsp;base64_cleanup()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;free(decoding_table);}请记住,这不会做任何错误检查,而解码-非基本64编码的数据将得到处理。
打开App,查看更多内容
随时随地看视频慕课网APP