2010-07-13 2 views
2

У меня возникли проблемы с передачей координат местоположения на набор моторов, подключенных к сети. Я могу отправить строку просто отлично и получить текст обратно с мотора, но я не могу отправить его значение int.Запись 64-битного значения int в NSOutputStream

Использование NSlog Я определил, что фактическое значение, которое я отправляю, является правильным, однако я подозреваю, что мой метод отправки его через выходной поток неверен. Есть идеи?

Мой код для отправки INT значения 64-битного:

uint64_t rawInt = m1; 
rawInt <<= 16; 
rawInt |= m2; 
NSData *buffer = [NSData dataWithBytes: &rawInt length:8]; 
[outputStream write: [buffer bytes] maxLength:[buffer length]]; 

ответ

7

Ну, ваши коды выглядят смешно. Во всяком случае, для отправки двоичного целого по сети вам нужно знать endianess: приемник либо ожидает, что маленькие или большие целые числа 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)]; 
+0

Код выше дает предупреждение: «предупреждение: передавая аргумент 1 из„пишут: MAXLENGTH:“от несовместимого типа указателя». – isometrik

+0

Несмотря на предупреждение, код работает. Моя приверженность была противоположностью тому, что должно быть. Благодаря! – isometrik

+0

Добавлен бросок, чтобы удалить предупреждение. –

1

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

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