Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

Вы, вероятно, видим проблему эндин.CPU Intel - это em> Little-Endian , что означает, что наименее значительный байт в многобайтовом значении сохраняется первым, самый значительный байт последний.Чтение 8-байтового номера из памяти и вкладывая его в сеть, не делая ничего, не заставит байты выходить в этом порядке.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top