以最有效的形式将32位值存储为C字符串

Store 32 bit value as C string in most efficient form

本文关键字:存储 字符串 32位 有效      更新时间:2023-10-16

我正在努力寻找最有效的方法,将32位散列字符串值编码为文本字符串,以便在低带宽环境中传输/记录。不能使用复杂的压缩,因为在客户端和主机之间进行记录和发送时,散列值需要包含在人类可读的文本字符串中。

考虑以下人为的例子:

给定密钥/价值映射

table[0xFE12ABCD] = "models/texture/red.bmp";
table[0x3EF088AD] = "textures/diagnostics/pink.jpg";

字符串格式:

"Loaded asset (0x%08x)"
"Replaced (0x%08x) with (0x%08x)"

它们可以打印为:

"Loaded asset models/texture/red.bmp"
"Replaced models/texture/red.bmp with textures/diagnostics/pink.jpg"

或者,如果客户端和服务器知道密钥/值映射:

"Loaded asset (0xFE12ABCD)"
"Replaced (0xFE12ABCD) with (0x3EF088AD)"

然后,接收器可以扫描(0xNNNNNNNN)模式并在本地展开它。

这就是我现在正在做的,但我想找到一种更有效地表示32位值的方法。一个简单的步骤是使用一个更好的识别令牌:

"Loaded asset $FE12ABCD"
"Replaced $1000DEEE with $3EF088AD"

这已经减少了每个代币的长度——$没有在其他地方使用,所以它是合理的。

然而,还有什么其他选项可以使32位的值更小?我不能使用索引——它必须是一个完整的32位值,因为在某些情况下,字符串的生成器有散列,有时它有一个字符串,它会立即散列。

一个常见的解决方案是使用Base-85编码。您可以将四个字节编码为五个Base-85数字,因为855232。选取85个可打印字符,并将它们分配给数字值0..84。然后进行基数转换,以实现任意一种方式。由于ASCII中有94个可打印字符,因此通常很容易找到85个"安全"的字符,无论这些字符限制了字符串的"可读性"。