Запись 64-битного значения int в NSOutputStream - PullRequest
2 голосов
/ 13 июля 2010

У меня проблемы с передачей координат положения на набор двигателей, которые я подключил в сети. Я могу просто отправить строку и получить текст обратно от двигателя, но я не могу отправить ей значение типа 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]];

Ответы [ 2 ]

7 голосов
/ 13 июля 2010

Ну, ваши коды выглядят довольно забавно.В любом случае, для отправки двоичного целого числа по сети вы должны знать порядковый номер: получатель ожидает либо маленькие, либо большие порядковые числа.

Вот код для обоих:

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)];
1 голос
/ 13 июля 2010

Вы, вероятно, видите проблему с порядком байтов. Процессоры Intel имеют little-endian , что означает, что младший байт в многобайтовом значении сохраняется первым, а старший значащий байт - последним. Считывание 8-байтового числа из памяти и включение его в сеть без каких-либо действий приведет к тому, что байты будут выходить в указанном порядке.

Большинство сетевых протоколов (включая все интернет-протоколы) ожидают данных с прямым порядком байтов , поэтому самый старший байт появляется в сети первым, а младший - последним. Ваш сетевой протокол ожидает этого?

...