计算Base 64解码消息的大小
Calculate the size to a Base 64 decoded message
我有一个BASE64编码字符串:
static const unsigned char base64_test_enc[] =
"VGVzdCBzdHJpbmcgZm9yIGEgc3RhY2tvdmVyZmxvdy5jb20gcXVlc3Rpb24=";
它没有CRLF-per-72字符。
如何计算解码后的消息长度?
好吧,base64表示4个字符中的3个字节。。。所以首先你只需要除以4再乘以3。
然后你需要考虑填充:
- 如果文本以
"=="
结尾,则需要减去2个字节(因为最后一组4个字符仅代表1个字节) - 如果文本仅以
"="
结尾,则需要减去1个字节(因为最后一组4个字符表示2个字节) - 如果文本根本没有以填充结束,则不需要减去任何内容(因为最后一组4个字符表示正常情况下的3个字节)
Base 64每3个字节使用4个字符。如果它使用填充,它总是有4个字符的倍数。
此外,还有三种填充可能性:
- 一个编码字节的两个字符和两个填充字符CCD_ 3
- 3个字符和用于两个编码字节的一个填充字符
=
- 当然没有填充字符,形成3个字节
因此,您可以简单地将字符数除以4,然后乘以3,最后减去填充字符数。
可能的C代码可能是(如果我对C不是非常生疏,请调整):
size_t encoded_base64_bytes(const char *input)
{
size_t len, padlen;
char *last, *first_pad;
len = strlen(input);
if (len == 0) return 0;
last = input + len - 4;
first_pad = strchr(last, '=');
padlen = first_pad == null ? 0 : last - first_pad;
return (len / 4) * 3 - padlen;
}
请注意,此代码假定输入是有效的基数64。
一个好的观察者会注意到有多余的位,如果使用填充,通常在最后的字符中设置为0。
相关文章:
- boost::进程间消息队列引发错误
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 无法解码base64+deflate数据
- 如何通过参数抛出错误消息
- 从服务器传输到客户端的消息不会出现
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- ROS2 动态消息模板
- C++秘密消息学校作业
- 使用公钥加密消息:BER 解码错误
- 如何使用 asn1c 生成的代码解码 MAP 调用消息
- 带有 H264 编解码器的 libav 错误消息。"非严格单调PTS"
- C++ 文本消息解码器脚本 编译器 "expects unqualified id" 之前 if 和 else 语句
- 给定哈希函数解码消息的最佳方法是什么
- 将在64位应用程序中编码Protobuf消息并在32位应用程序中解码
- 计算Base 64解码消息的大小
- 解码有趣的ISO编码的电子邮件消息
- 错误是发送还是接收?未发送完整消息或消息未正确解码