2010-07-13 4 views
2

네트워크에 연결된 모터 세트에 위치 좌표를 전달하는 데 문제가 있습니다. 나는 문자열을 잘 보내고 모터에서 텍스트를 다시받을 수 있지만 int 값을 보낼 수 없습니다.NSOutputStream에 64 비트 int 값 쓰기

NSlog를 사용하여 출력하는 실제 값이 올바른지 확인했지만 출력 스트림을 통해 보내는 방법이 잘못되었다고 생각합니다. 어떤 아이디어?

64 비트 int 값을 보내는 내 코드 :

uint64_t rawInt = m1; 
rawInt <<= 16; 
rawInt |= m2; 
NSData *buffer = [NSData dataWithBytes: &rawInt length:8]; 
[outputStream write: [buffer bytes] maxLength:[buffer length]]; 

답변

7

글쎄, 당신의 코드는 좀 웃겨 보입니다. 어쨌든, 네트워크를 통해 이진 정수를 전송하려면 엔디안을 알아야합니다. 리시버는 리틀 또는 빅 엔디안 정수를 기대합니다.

여기에 모두 코드입니다 :

uint64_t myInt = 42; 

uint64_t netInt = CFSwapInt64HostToLittle(myInt); // use this for little endian 
uint64_t netInt = CFSwapInt64HostToBig(myInt); // use this for big endian 

[outputStream write:(uint8_t*)&netInt maxLength:sizeof(netInt)]; 
+0

위의 코드는 경고를 제공합니다 : "경고 :의 인수 1 통과 '쓰기 : 최대 길이를'호환되지 않는 포인터 유형에서". – isometrik

+0

경고에도 불구하고 코드가 작동합니다. 나의 endianess는해야하는 것의 반대였습니다. 감사! – isometrik

+0

캐스트 제거 경고가 추가되었습니다. –

1

당신은 아마 엔디안 문제를보고있다. Intel CPU는 little endian 인입니다. 즉, 다중 바이트 값의 최하위 바이트가 먼저 저장되고 최하위 바이트가 마지막에 저장됩니다. 메모리에서 8 바이트 수를 읽고 아무 ​​것도하지 않고 네트워크에 올려 놓으면 바이트가 순서대로 꺼집니다.

대부분의 네트워크 프로토콜 (모든 인터넷 프로토콜 포함)은 빅 엔디안 데이터를 예상하므로 가장 중요한 바이트가 먼저 네트워크에 표시되고 최하위 바이트가 마지막으로 표시됩니다. 네트워크 프로토콜이이를 기대합니까?