2016-12-22 2 views
3

나는 C#으로 작성된 tcp 서버가 있습니다. 두 클라이언트 (C++ 및 javascript) 작성해야합니다. decimal (16byte - 128bit) 클라이언트에서 C#으로 역 직렬화 할 수 있지만 다른 언어는 deserialize 할 수 없습니다.십진수 ~ C++ float 및 자바 스크립트 번호

십진수가 너무 크지 않아 float 또는 double을 사용할 수 있습니다.

때 직렬화 진수 :

MemoryStream combinedMessage = new MemoryStream(); 
decimal d = 2135102.06m; 
using (BinaryWriter writer = new BinaryWriter(combinedMessage, encoding)) 
{ 
    writer.Write(d); 
} 

byte[] message = combinedMessage.ToArray(); 

직렬화와 같은 :

 62 232 185 12 0 0 0 0 0 0 0 0 0 0 2 0 

내가 바이트 [] C에서 ++와 자바 스크립트에서 소수점을 역 직렬화 할 수 있습니까?

+1

당신은 플로트'에 decimal''에서 변환하지 왜 이진 부동 소수점 값으로 직렬화있어 경우 '또는'double' 먼저? 그게 다른 언어로 deserialize 훨씬 간단하게해야합니다 ... –

+0

나는 서버 쪽을 바꿀 수 없다 –

+3

그건 안 됐네. 이 경우 정확한 바이너리 형식에 대한 10 진수 설명서를 읽고 변환을 직접 구현해야합니다. 기본적으로 정수를 먼저 꺼낸 다음 적절하게 스케일을 조정해야합니다. –

답변

3

처음 12 바이트는 리틀 엔디안 96 비트 정수이고 바이트 13과 14는 사용되지 않고 (현재) 사용되지 않으며 바이트 15는 스케일 (10의 제곱으로 나눔)을 포함하며 바이트 16은 부호 비트 MSB에서 (다른 비트는 사용되지 않음). 가장 큰 어려움은 정확한 변환에 있습니다. 십진수가 "너무 크지 않더라도"float 또는 Number으로 변환하는 것은 정확도가 다소 떨어지는 방식으로 수행 할 수 있습니다.

다음 루틴은 반드시 소수점 이하를 변환하는 가장 정확한 방법은 아니지만 정확도 나 속도에 지나치게 관심이 없다면 작업을 완료하게 될 것입니다. 대부분의 C와 유사한 언어로 쉽게 번역 할 수 있습니다. 여기 자바 스크립트에 있습니다

var b = [ 62, 232, 185, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 ]; 

var d = 0.0; 
for (var i = 11; i >= 0; --i) { 
    var k = b[i]; 
    for (var j = 0; j != 8; ++j) { 
     d *= 2; 
     d += (k & 0x80) >> 7; 
     k <<= 1; 
    } 
} 
var scale = b[14]; 
d /= Math.pow(10, scale); 
if (b[15] >= 0x80) d = -d; 

이 이미 거의 유효한 C 번호입니다; 변경해야하는 것은 Math.Powbyte[] b = { 62 ... }입니다. C에 대한 (그리고 ++ 확장 C에 의해) 변화가 훨씬 더 복잡하지 않습니다 :

#include <math.h> 

unsigned char b[] = { 62, 232, 185, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 }; 

double d = 0.0; 
for (int i = 11; i >= 0; --i) { 
    unsigned char k = b[i]; 
    for (int j = 0; j != 8; ++j) { 
     d *= 2; 
     d += (k & 0x80) >> 7; 
     k <<= 1; 
    } 
} 
int scale = b[14]; 
d /= pow(10, scale); 
if (b[15] >= 0x80) d = -d; 
+0

thats, 고맙습니다. –

+0

@CihanT : 0 (이전 반복에서 남긴 바이트)을 건너 뛰는 코드로 다소 심각한 버그가 수정되었습니다. –