最简洁的方式来表示csv文件中的32位整数

时间:2017-10-11 05:28:15

标签: compression

我有很多来自测量的(无符号)整数。它们存储在csv文本文件中:

1111492765
562352
5362346
...

由于我必须通过低带宽连接传输此文件,我正在寻找一种节省存储空间(字符)的方法。

除了使用压缩(gzip,...)之外,最好的方法是什么?

到目前为止,将32位整数表示为十六进制值似乎很有希望:

1111492765 = 10 Byte

相同
4240089D = 8 Byte

注意:在传输的接收部分,我可以将文件转换为我喜欢的任何内容。

1 个答案:

答案 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)。

另请注意:如果您的值的子集彼此非常相似(在您的示例中不是这种情况,但可能是实际测量值的情况),您还可以通过仅编码之间的差异来使用增量压缩两个值。