отправьте int из target-c в java через сокет, но значение изменилось на стороне java - PullRequest
0 голосов
/ 19 апреля 2011

Я отправляю int в NSData следующим образом:

 NSData* dataLength = [[NSData alloc] initWithBytes:&theInt length:sizeof(theInt)];

, затем на стороне java я получаю int как:

int theInt = aInputStreamOfSocket.readInt();

, но значение изменилось!В моем случае я отправляю 1225516 и получаю 749933056 в чем проблема?

Ответы [ 2 ]

2 голосов
/ 19 апреля 2011

Ваша проблема в разнице endianness .Процессоры на базе Intel используют порядок байтов с прямым порядком байтов, тогда как сетевые транспорты почти всегда имеют порядок байтов.Java, таким образом, ожидает big-endian для readInt().В идеале вы находите способ отправить int с прямым порядком байтов, чтобы соответствовать ожидаемому поведению.У меня, однако, нет этого кода от руки, так что вот как читать little-endian на стороне Java:

1 голос
/ 19 апреля 2011

Давайте посмотрим на гекс для обоих этих чисел

1225516   = 0x0012B32C  
749933056 = 0x2CB31200

Вы можете видеть, что порядок байтов (a.k.a. endianness) обратный.

Обычно, если вы отправляете данные через сокет, вы конвертируете из локального порядка байтов в сетевой порядок байтов с помощью функций htonl, htons и т. Д. На принимающей стороне вы конвертируете из сетевого порядка байтов вернуться к локальному порядку байтов. В Java вы можете сделать это, установив порядок байтов в буфере с помощью ByteBuffer # order (ByteOrder)

См. этот вопрос также.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...