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.