2012-04-06 2 views
1

C32 컴파일러를 실행하는 PIC32 임베디드 마이크로 컨트롤러가 있습니다. Java 프로그램에 64 비트 double 값을 포함하는 UDP 패킷을 보냅니다. 내 테스트에서는 Java에 십진수 40.5를 보내려고합니다.MIPS C에서 자바로 변환하는 IEEE 754 배정 밀도

내가 받게 될 것입니다 : 0x4044400000000000

이후 에서 System.out.println (Double.longBitsToDouble (0x4044400000000000L));

인쇄 : 내가 어떤 변환없이 UDP 패킷을 보낼 경우, I 받고있어 40.5

: 0x00002242352D3330

내가 자바로이 값을 얻을 수있는 방법 어떤 생각? 더블의 C32 표현의 머리 나 꼬리를 만들 수는 없습니다.

+2

엔디안은 동일합니까? – dbrank0

+0

PIC의 sizeof (double)은 실제로 8입니까? 네가 이중에서 htonl을 어떻게 부르는거야? – Collin

+0

어떻게 이것을 자바로 가져 가고 있습니까? –

답변

2

PIC32는 리틀 엔디안입니다. double은 64 비트로 표시되고 long은 32 비트입니다. 64 비트의 경우 long long이 필요합니다.

htonl()은 위에서 언급 한대로 long입니다. 캐스트로 자르며 엔디안 변환 후에 표시된 결과가 표시됩니다.

나는 이것을 pastebin에 발견했다. 64 비트를 변환하는 데 사용할 매크로입니다. long long :

#define htonll(x) \ 
((((x) & 0xff00000000000000LL) >> 56) | \ 
(((x) & 0x00ff000000000000LL) >> 40) | \ 
(((x) & 0x0000ff0000000000LL) >> 24) | \ 
(((x) & 0x000000ff00000000LL) >> 8) | \ 
(((x) & 0x00000000ff000000LL) << 8) | \ 
(((x) & 0x0000000000ff0000LL) << 24) | \ 
(((x) & 0x000000000000ff00LL) << 40) | \ 
+0

유용합니다. 그래서 htonl은 제 데이터 중 일부를 잘라 버립니다. 또한 제거한 struct packing 문제도 발견했습니다. 질문은 지금 보내고 받고있는 실제 데이터로 업데이트되었습니다. –

+0

+1이 유용하기 때문에 java 또는 PIC –

+1

에서 실행할 수 있습니다.이 매크로는'#if LITTLE_ENDIAN ... #else #define htonll (x) x # endif'와 같은 형태로 래핑 된 경우에 더 유용합니다. 왜냐하면 당신은 이식 가능한 코드를 가지고 있기 때문입니다. –

1

htonl()double이 아니라 long이됩니다.

관련 문제