【发布时间】:2016-10-15 07:56:24
【问题描述】:
我正在使用 libconfig 创建配置文件,其中一个字段是加密文件的内容。出现问题的原因是文件中有一些转义字符会导致内容的部分存储。存储这些数据以避免意外逃逸的最佳方法是什么?转换成unicode? 有什么建议吗?
【问题讨论】:
-
使用
base64对您的加密内容进行编码。
我正在使用 libconfig 创建配置文件,其中一个字段是加密文件的内容。出现问题的原因是文件中有一些转义字符会导致内容的部分存储。存储这些数据以避免意外逃逸的最佳方法是什么?转换成unicode? 有什么建议吗?
【问题讨论】:
base64对您的加密内容进行编码。
您可以使用 URL 编码,其中每个非 ASCII 字符编码为 % 字符后跟两个十六进制数字,或者使用 base64 编码 ,其中每组 3 个字节被编码为 4 个 ASCII 字符(3x8 位 -> 4x6 位)。
例如,如果您有以下字节:
00 01 41 31 80 FE
您可以按如下方式对其进行 URL 编码:
%00%01A1%80%FE
或者你可以像这样进行base64编码,0-25 = A-Z, 26-51 = a-z, 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 答案中有很多指针:How do I base64 encode (decode) in C?
【讨论】: