以最有效的形式将32位值存储为C字符串
Store 32 bit value as C string in most efficient form
我正在努力寻找最有效的方法,将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个"安全"的字符,无论这些字符限制了字符串的"可读性"。
相关文章:
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 在向量 C++14(无限制联合)的结构内的联合中创建和存储字符串
- 如何存储字符串列表
- 在向量中存储字符串存在 SEG 错误
- 指针存储字符串?
- 逐个字母存储字符串并打印
- 将字符数组转换为字符串并存储字符串?
- 当分配动态内存以存储字符串副本时,程序会中断
- 在C/C++中存储字符串、数组和指针,哪种方法更有效
- 我们如何以 7 位格式存储字符串
- C 存储字符串输入为CString
- TVItem lparam存储字符串
- C++以相反的顺序存储字符串
- 如果存储字符串的char数组小于字符串,则C++实际存储字符串
- 为什么我的 SetBookTitle 不存储字符串
- 如何在 C 中有效地存储字符串的映射
- 如何使用好友运算符存储字符串
- 如何在 C++ 中存储字符串和整数串联的变量
- 如何在 c++ 中存储字符串数组
- 存储字符串