2010-11-20 4 views
1

자바 서버로 보내는 메시지를 구걸하는데 정수와 정수를 넣어야합니다. 서버는 짧은 (메시지 ID) 다음 정수 (메시지 길이)를 읽으 려합니다. NSMutableData는 java ByteBuffer와 비슷한 stackoverflow를 읽었습니다.NSMutableData를 사용하는 Objective-C 패킹 데이터?

메시지를 NSMutableData에 압축하여 보내려고합니다.

그래서 내가 가지고있는 것이지만 작동하지 않습니다!

NSMutableData *data = [NSMutableData dataWithLength:(sizeof(short) + sizeof(int))]; 

short msg_id = 2; 
int length = 198; 

[data appendBytes:&msg_id length:sizeof(short)]; 
[data appendBytes:&length length:sizeof(int)]; 

send(sock, data, 6, 0); 

서버는 Java ByteBuffer를 사용하여 수신 된 데이터를 읽습니다. 따라서 들어오는 바이트 수는 다음과 같습니다.

32,120,31,0,2,0 

의 ByteBuffer 그래서 올바른 값은 .getShort()와 .getInt()로 읽을 수

0,2,0,0,0,-66 

답변

4

당신은 기본적으로 올바르게있는 NSData 객체에 물건을두고있어,하지만 당신은 그것을 사용하지 않는 send이 올바르게 작동합니다. 우선 dreamlax에서 제안하는대로 NSMutableData의 -initWithCapacity 이니셜 라이저를 사용하여 0이 아닌 바이트를 가져옵니다.

data 포인터는 실제 원시 바이트 버퍼가 아닌 Object-C (NSData) 객체에 대한 포인터입니다. send 함수는 고전적인 UNIX-C 함수이며 Objective-C 객체에 대해 아무것도 모릅니다. 그것은 실제 바이트에 대한 포인터를 기대 : 서버에서 멀티 바이트 필드를 회복 기대하는 경우

send(sock, [data bytes], [data length], 0); 

또한, FWIW, 여기에 그 엔디안 문제를 확인합니다. 서버가 패킷 형식에 대해 "네트워크"바이트 순서를 예상한다고 가정하면 (패킷을 제어 할지라도) NSData 버퍼에 넣기 전에 short 및 int 값에 HTONLHTONS을 사용하는 것이 좋습니다.

+1

+1,하지만 그는 올바르게'dataWithCapacity :'대신'dataWithLength :'를 사용하고 있기 때문에 데이터를 NSData 객체에 올바르게 넣고 있다고 생각하지 않습니다. – dreamlax

+0

Dreamlax에 감사드립니다. 나는 [data bytes]와 dataWithCapacity를 사용했다. 나는 실제로 서버 측에서 2,0,5,8,0,0,0 바이트를 얻고있다. 바이트는 역순입니다. 내가 보내기 전에 어떻게 고칠 수 있겠 어. 다른 java csci와 잘 작동하는 서버를 변경하고 싶지 않습니다. any recommendation – Unis

+0

다시 한번 HTONS (msg_id)와 HTONL (length)을 사용했습니다. 바이트 순서가 올바르지 않습니다. – Unis

1

나는 의 6 바이트가 모두 0으로 초기화 된 객체를 제공하지만 실제로 값이 6 바이트 더 늘어난다는 것을 알 수 있습니다 (12 바이트로 끝날 것입니다). 여기서 short은 2 바이트이고 int은 4라고 가정합니다. dataWithCapacity:을 사용하여 포장하려는 데이터에 대해 을 예약하는 방법을 알리고 싶습니다.

quixoto가 지적한 것처럼 bytes 메서드를 사용해야합니다.이 메서드는 실제 데이터의 첫 번째 바이트에 대한 포인터를 반환합니다. length 메서드는 가지고있는 바이트 수를 반환합니다.

조심해야 할 또 다른 일은 엔디안입니다. 최상위 바이트의 위치는 기본 아키텍처에 따라 다릅니다.