2017-10-11 7 views
2

私は、測定に由来する(符号なしの)整数がたくさんあります。これらは、CSV形式のテキストファイルに格納されています。私は、低帯域幅の接続を介して、このファイルをtransmittする必要があるので、私はストレージ・スペース(文字)を保存する方法を探していますCSVファイル内の32ビット整数を表現する最もコンパクトな方法

1111492765 
562352 
5362346 
... 

圧縮(gzip、...)を使用するのに最適な方法は何ですか? hexvaluesが有望と思われるよう

は、これまで32ビット整数を表す:伝送の受信部には、私はにファイルを変換することができます

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 

を、あなたはよ"modulo 64"と "divide with 64"を繰り返して数値を変換する必要があります。この方法で、Base64アルファベット(たとえばABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/)を使用してエンコードできる0..63の範囲の値が得られます。受信コードでは、文字を再結合して元の値を得ることができます。 「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があります)を取得するためにアルファベットを拡張することができます。

注意:値のサブセットがお互いに非常に似ている場合(実際の測定値の場合もあります)、デルタ圧縮を差分2つの値の間。

関連する問題