2013-02-13 2 views
0

У меня есть целое число, со значением 2. Я добавить, что к объекту NSMutableData с:NSData байтов из целого

[data appendBytes:&intVal length:2]; 

Число 2 является число байтов, которые я хочу от междунар. Когда я регистрирую данные, то я хочу видеть < 0002> (один пустой байт, за которым следует один непустой байт), но я получаю < 0200>.

Я что-то упустил? Порядок и длина байтов должны быть очень конкретными. Это для прямого API соединения сокетов. Я не совсем уверен, что я делаю неправильно здесь. Может быть, я просто читаю это неправильно.

Спасибо за помощь.

+2

Знали ли вы, что sizeof (int) может отличаться от 2? –

+1

попытайтесь покопаться в различии между представлением _low-endian_, _big-endian_, возможно, это поможет вам. – holex

+0

sizeof (int) в этом случае определенно больше 2 (это 4). Однако api, который я использую, требует, чтобы эта часть пакета имела длину всего 2 байта. – btomw

ответ

1

Я что-то упустил?

Да, консистенция вашей системы не соответствует тому, что вам нужно. Преобразуйте его в маленький или большой endian (библиотека POSIX C имеет функции для этой цели где-то в заголовках <netinet.h> или <inet.h>).

+1

+1. Эта. OP ожидает Big Endian, причем самый старший байт сначала (00000000 00000010), но получает Little Endian, сначала младший байт (00000010 00000000). Кроме того, я не знаю, есть ли такая замечательная идея использовать 'int', который потенциально может превышать 2 байта. – Metabble

+0

Это имеет смысл, на самом деле. С моей стороны это был настоящий мозг. Спасибо, ребята, за то, что вернули меня в нужное русло. – btomw

+0

@btomw Добро пожаловать. – 2013-02-14 14:46:52

0

Метод описания NSData печатает его значения в шестнадцатеричном формате. Это означает, что для представления 2 байта ему требуется 4 цифры, каждый байт может отображать 2^8 = 256 различных значений, каждая шестнадцатеричная цифра может отображать 16 возможных значений, поэтому 16x16x16x16 = 2^16, что именно то, что вы можете отобразить с 2 байтами ,

0

Вот ответ, он отлично работает!

uint16_t intVal = 2; 
Byte *byteData = (Byte*)malloc(2); 
byteData[1] = majorValue & 0xff; 
byteData[0] = (majorValue & 0xff00) >> 8; 
NSData * result = [NSData dataWithBytes:byteData length:sizeof(uint16_t)]; 
NSLog(@"result=%@",result);