2017-10-11 6 views
2

나는 측정에서 비롯된 많은 (부호없는) 정수를 가지고 있습니다. 사람들은 CSV TEXTFILE에 저장됩니다 : 나는 낮은 대역폭 연결을 통해이 파일을 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있다) 짧은 인코딩을 얻을 수있는 알파벳을 확장 할 수 있습니다.

참고 : 값의 하위 집합이 서로 매우 유사 할 경우 (실제 측정 값의 경우 일 수 있음) 차이점 만 인코딩하여 델타 압축을 추가로 사용할 수 있습니다 두 값 사이.