2017-10-11 16 views
2

J'ai beaucoup d'entiers (non signés) provenant d'une mesure. Ceux-ci sont stockés dans un fichier CSV Textfile:Façon la plus compacte de représenter un entier de 32 bits dans un fichier csv

1111492765 
562352 
5362346 
... 

Depuis que je dois transmitt ce fichier via une connexion à faible bande passante Je cherche un moyen d'économiser d'espace de stockage (caractères).

Quelle est la meilleure façon de le faire en plus d'utiliser une compression (gzip, ...)?

représentant Jusqu'à présent, les entiers 32 bits comme hexvalues ​​semble prometteur:

1111492765 = 10 Byte 

est le même que

4240089D = 8 Byte 

Note: A la partie réception de la transmission que je peux convertir le fichier tout ce que j'aime.

Répondre

2

Suite à votre entier -> hex idée (base 16), vous pouvez convertir les nombres à Base64 - de cette façon, vous aurez seulement besoin ceil(log(number value)/log(64)) caractères, par exemple:

ceil(log(1111492765)/log(64)) = ceil(5.008) = 6 characters 
ceil(log(562352)/log(64)) = ceil(3.184) = 4 characters 

Pour cela, vous avoir à convertir la valeur numérique en répétant "modulo 64" suivi de "diviser avec 64". De cette façon, vous obtiendrez des valeurs dans la plage 0..63 que vous pouvez encoder en utilisant un alphabet Base64 (par exemple ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/). Sur le code de réception, vous pouvez recombiner les caractères pour obtenir la valeur d'origine.

Exemple pour « 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 

Selon le nombre de caractères valides que vous pouvez trouver pour csv, vous pouvez étendre l'alphabet pour obtenir des codages plus courtes (par exemple, il y a Ascii85/Base85). Remarque: Si un sous-ensemble de vos valeurs est très similaire (ce qui n'est pas le cas dans votre exemple, mais pourrait être le cas pour les valeurs mesurées réelles), vous pouvez également utiliser la compression delta en encodant uniquement la différence entre deux valeurs.