我正在使用 libconfig 创建配置文件,其中一个字段是加密文件的内容。出现此问题是因为文件中有一些转义字符会导致内容的部分存储。存储这些数据以避免意外逃逸的最佳方法是什么?转换成unicode?有什么建议吗?
2 回答
您可以使用URL encoding,其中每个非 ASCII 字符编码为一个%
字符后跟两个十六进制数字,或者您使用base64 encoding,其中每组 3 个字节编码为 4 个 ASCII 字符(3x8 位 -> 4x6 位)。
例如,如果您有以下字节:
00 01 41 31 80 FE
您可以按如下方式对其进行 URL 编码:
%00%01A1%80%FE
或者你可以像这样对它进行base64编码,0-25 = AZ, 26-51 = az, 52-62 = 0-9, 62 = ., 63 = /:
(00000000 00000001 01000001) (00110001 10000000 11111110) -->
(000000 000000 000101 000001) (001100 011000 000011 111110)
AAJBNYD.
在文本中编码二进制数据的标准曾经是 uuencode,现在是 base64。两者都使用相同的范例:一个字节使用 8 位,因此 3 个字节使用 24 位或 4 个 6 位字符。
uuencode 仅使用偏移量为 32 的 6 位(空格的 ascii 代码),因此字符在 32-96 范围内 => 全部在可打印的 ascii 范围内,但包括空格和可能具有特殊含义的其他字符
base64 选择了这 64 个字符来表示 0 到 63 之间的值(没有=:;,'"\*(){}[]
特殊含义……):
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
并且等号 ( =
) 是空位置和编码字符串结尾的占位符,以确保编码字符串长度是 4 的倍数。
不幸的是,C 和 C++ 标准库都没有提供用于 uuencode 的函数而不是 base 64 转换,但是您可以找到很好的实现,在这个其他 SO 答案中有很多指针:我如何在 C 中进行 base64 编码(解码)?