Base64编码出现的背景【参考1】:电子邮件的传输需要把原始内容编码为可见的ASCII来进行传输,很早之前出现的电子邮件编码规则兼容性不太好,比如没有考虑邮件的多种内容的问题,还有对文件音频视频附件之类兼容不好。因此,提出来新的编码,这种新的编码格式编解码很简单,同时编码后的内容只比编码之前大33%,这就是Base64。
这里是来自网上【参考2】的一份 Arduino base64库,下面简单介绍一下用法:
int base64_encode(char *output, char *input, int inputLen); 对字符串进行base64编码
int base64_decode(char *output, char *input, int inputLen); 对Base64字符串进行b解码
int base64_enc_len(int inputLen); “预测”Base64编码后的字符串长度
int base64_dec_len(char *input, int inputLen); “预测”Base64编码字符串解码后的字符串长度
下面是一个完整的例子【参考2】:
#include <Base64.h> /* Base64 Encode/Decode example Encodes the text "Hello world" to "SGVsbG8gd29ybGQA" and decodes "Zm9vYmFy" to "foobar" Created 29 April 2015 by Nathan Friedly - http://nfriedly.com/ This example code is in the public domain. */ void setup() { // start serial port at 9600 bps: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } Serial.println("Base64 example"); // encoding char input[] = "Hello world"; int inputLen = sizeof(input); int encodedLen = base64_enc_len(inputLen); char encoded[encodedLen]; Serial.print(input); Serial.print(" = "); // note input is consumed in this step: it will be empty afterwards base64_encode(encoded, input, inputLen); Serial.println(encoded); // decoding char input2[] = "Zm9vYmFy"; int input2Len = sizeof(input2); int decodedLen = base64_dec_len(input2, input2Len); char decoded[decodedLen]; base64_decode(decoded, input2, input2Len); Serial.print(input2); Serial.print(" = "); Serial.println(decoded); } void loop() { }
运行结果:
这里【参考4】,提供了一个在线版的Base64编解码工具,可以用来检查结果是否正确。
完整的代码下载:
sketch_apr20a
最后,之前我还介绍过MD5的 Arduino 库【参考3】,有兴趣的朋友也可以研究一下。
参考:
1. http://www.faqs.org/rfcs/rfc2045.html
2. https://github.com/adamvr/arduino-base64 库下载
arduino-base64-master
3. http://www.lab-z.com/arduinomd5/ Arduino 的MD5库
4. http://www1.tc711.com/tool/BASE64.htm 在线编码解码