2017-10-11 78 views
2

我有很多来自测量的(无符号)整数。这些被存储在一个文本文件CSV:在csv文件中表示32位整数的最紧凑方式

1111492765 
562352 
5362346 
... 

因为我有通过低带宽连接要传输的文件,我在寻找一种方式,以节省存储空间(字符)。

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

到目前为止,代表32位整数作为hexvalues很有前途:

1111492765 = 10 Byte 

相同

4240089D = 8 Byte 

注:在传输的接收部分,我可以将文件转换为我喜欢的东西。

回答

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 

对于这一点,你会必须通过重复“模64”,然后“除64”来转换数值。这样,您将得到0到63范围内的值,您可以使用Base64字母进行编码(例如ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/)。在接收代码上,您可以重新组合字符以获取原始值。

为“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)。另外请注意:如果您的值的子集彼此非常相似(在您的示例中不是这种情况,但实际测量值可能是这种情况),那么您可以额外使用增量压缩,只需编码差异在两个值之间。