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 在线编码解码
