2012-10-30 4 views
0

C++double 값의 transfering은

unsigned char lbytes[] = { 0x0A, 0x01, 0x02 }; 
unsigned char bytes[10]; 

double dbl = sin((double)i) * 10; 

i+=5; if (i == 360) i = 0; 

memcpy(&bytes, &lbytes, 3); 
cout << dbl << endl; 
memcpy(&bytes[3], &dbl, sizeof(double)); 

C#을

switch (m[1]) { 
    case 0x01: { 
     if (m.Length > 5) { 
      double myval = Math.Round(BitConverter.ToDouble(m, 3), 2); 

하지만 뭔가 잘못 여기에 가고, myval는 매우 작은 값 alsways하고 rount으로는 항상 0

입니다 질문은 다음과 같습니다. 실수는 어디에서 볼 수 있습니까? 유효한 값을 볼 수 있습니까? 10 바이트를 보냅니다. 무엇이 잘못 되었나요?

+2

배열의 경계 너머에'double '을 복사하지 않습니까? –

+1

엔디 언 차이 (big-endian vs little-endian)와 비슷하게 들립니다. 'BitConverter'는 CPU 엔디안 방식을 사용하기 때문에 청크를 뒤집을 수 있습니다. 나는 최근에 그것에 대한 답변을 게시했다 ... try : http://stackoverflow.com/questions/13044200/converting-float-values-of-big-endian-to-little-c-sharp/13044715#13044715 (you ' 더블, 분명히)에 대한 8 바이트로 확장해야합니다 –

+0

그건 단지 10 바이트를 보내는 내 잘못이야 – Cynede

답변

1

문제는 10 바이트를 보내는 것입니다. 더블은 이고, 8 바이트는 바이트이며, 3 바이트의 헤더는 11 바이트를 보내야 함을 의미합니다.

bytes 어레이를 조정하고 올바른 길이를 보내면 올바르게 작동합니다.