我有很多来自测量的(无符号)整数。它们存储在csv文本文件中:
1111492765
562352
5362346
...
由于我必须通过低带宽连接传输此文件,我正在寻找一种节省存储空间(字符)的方法。
除了使用压缩(gzip,...)之外,最好的方法是什么?
到目前为止,将32位整数表示为十六进制值似乎很有希望:
1111492765 = 10 Byte
与
相同4240089D = 8 Byte
注意:在传输的接收部分,我可以将文件转换为我喜欢的任何内容。
答案 0 :(得分:2)
关注您的整数 - >十六进制(基数为16)的想法,您可以将数字转换为Base64 - 这样,您只需要ceil(log(number value)/log(64))
个字符,例如:
ceil(log(1111492765)/log(64)) = ceil(5.008) = 6 characters
ceil(log(562352)/log(64)) = ceil(3.184) = 4 characters
为此,您必须通过重复执行“modulo 64”然后“除以64”来转换数字值。这样,您将获得0..63范围内的值,您可以使用Base64字母表进行编码(例如ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
)。在接收代码上,您可以重新组合字符以获得原始值。
“562352”的例子:
Encoding:
---------
562352 mod 64 = 48 => encode as "w"
floor(562352/64) = 8786
8786 mod 64 = 18 => encode as "S"
floor(8786/64) = 137
137 mod 64 = 9 => encode as "J"
floor(137/64) = 2
2 mod 64 = 2 => encode as "B"
Number is below 64 => finished
Decoding:
---------
wSJB = 48, 18, 9, 2
value = 48 + 18 * (64 ^ 1) + 9 * (64 ^ 2) + 2 * (64 ^ 3) = 562352
根据您可以为csv找到多少有效字符,您可以扩展字母表以获得更短的编码(例如,Ascii85/Base85)。
另请注意:如果您的值的子集彼此非常相似(在您的示例中不是这种情况,但可能是实际测量值的情况),您还可以通过仅编码之间的差异来使用增量压缩两个值。