문제

네트워크에 연결된 모터 세트에 위치 좌표를 통신하는 데 문제가 있습니다.나는 문자열을 잘 보낼 수 있고 모터에서 텍스트를 다시받을 수 있지만 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]];
.

도움이 되었습니까?

해결책

음, 코드는 재미있는 일을 보입니다.어쨌든, 네트워크를 통해 바이너리 정수를 보내는 데, 당신은 ennenianess를 알아야합니다. 수신자는 거의 또는 큰 엔디안 정수를 기대합니다.

여기서 코드가 있습니다 :

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)];
.

다른 팁

엔디안 문제를 볼 수 있습니다.Intel CPU는 리틀 엔디안 입니다. 즉, 멀티 바이트 값의 최소한 중요한 바이트가 먼저 저장되어 가장 중요한 바이트가 마지막으로 저장됩니다.메모리에서 8 바이트 숫자를 읽고 아무 것도하지 않고 네트워크에 넣으면 바이트가 해당 순서로 나옵니다.

모든 인터넷 프로토콜을 포함한 대부분의 네트워크 프로토콜 (모든 인터넷 프로토콜 포함)은 Big-Endian 데이터를 기대하므로 가장 중요한 바이트가 먼저 네트워크에 나타나고 중요한 바이트가 마지막으로 나타납니다.네트워크 프로토콜이 그 것으로 예상합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top