2013-05-20 6 views
0

Я сохранил байты данных в массиве. Теперь в программе я использовал getBytes: range: NSmakeRange (позиция, длина). Когда я печатал полученные байты, я думаю, что их позиция поменялась, и мой ответ был 0x0292 вместо 0x9202 (проверьте мою программу ниже).Нужно ли менять байты в этом сценарии в Objective-c?

Теперь я смущен, на каком правильном ответе. Мне действительно необходимо всегда менять байты, которые я получил. Пожалуйста, объясните мне эту концепцию, чтобы я мог ясно понять.

Вот мой код! Спасибо.

const Byte dataBytesArray[] = { 
    0x92, 0x02, 0x13, 0x14 //in Hex 
}; 

NSData *myDataArray = [[NSData alloc]initWithBytes:dataBytesArray length:4]; 
uint16_t ef; 
[myDataArray getBytes:&ef range:NSMakeRange(0, 2)]; 

NSLog(@"dataByteArray is %@ ",[NSNumber numberWithUnsignedInteger:ef]);//the answer I got is 658 in decimal format which is 0x0292 

uint16_t swapping = CFSwapInt16BigToHost(ef); //swapping the bytes 
NSLog(@"swap is %@ ",[NSNumber numberWithUnsignedInteger:swapping]); //after swapping I got 37378 which is 0x9202 

ответ

1

ли вы сделать использование таких функций, как CFSwapInt16BigToHost зависит от того, что вы имеете дело с обоих концов.

Если ваш «хост» (машина, на которой работает этот код), может меняться, тогда использование одной из многих функций CFSwap...ToHost - это действительно хорошая идея. Например, устройства Intel Mac и ARM iOS используют разные байтовые заказы. PowerPC Mac и Intel Mac используют разные байтовые заказы (я думаю, это правда). Чтобы сделать ваш код безопасным для работы в этих разных средах, разумно использовать правильную функцию «toHost».

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

Итак, главное решение - знать, какое байтовое упорядочение используется в полученных данных. Если вы знаете, что полученные данные находятся в порядке байтов байтов, то используйте соответствующие функции «BigToHost». Если вы знаете, что полученные данные находятся в порядке упорядоченного порядка, используйте соответствующие функции «LittleToHost». Если вы не знаете, тогда вы должны это выяснить.

Еще одна вещь, которую стоит рассмотреть - это отправить данные из вашего приложения. Вы должны использовать правильные функции «HostTo». Это действительно важно в приложениях iOS, например. Приложение iOS может быть запущено на устройстве ARM iOS или может работать в Simulator на Intel Mac. Если вы просто отправляете байты хоста, порядок будет зависеть от того, где приложение запускается. Это плохо. Поэтому приложение должно выбрать заказ, а затем использовать соответствующие функции «HostTo» для преобразования данных в выбранный порядок. Тогда любой код, который должен читать эти данные, может указывать тот же порядок при использовании функций «ToHost».

+0

Привет, Спасибо за ваш предыдущий ответ. Я также использовал CFByteOrderGetCurrent() и узнал, что моя машина использует Little Endian Format. Итак, когда я получаю данные с сенсорного устройства, которое использует формат данных MSB для LSB, тогда мне нужно использовать CFSwap ... BigToHost в моей IOS? Так как моя машина использует формат Little Endian! – Raj0689

+1

Если данные вашего сенсора имеют большой размер, тогда да, вы должны использовать 'CFSwap ... BigtoHost'. Это позволит вашему приложению iOS нормально работать при запуске на реальном устройстве iOS, а также при запуске в симуляторе. – rmaddy

0

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

См: http://en.wikipedia.org/wiki/Endianness

+0

Ваши общие утверждения могут быть или не быть правдой. Просто потому, что данные поступают из сети, не означает, что данные являются большими. И «ваша машина» может быть или не быть маленькой. Это зависит от машины. Intel Mac является одним из способов, а устройство ARM iOS - другое. – rmaddy

+0

@rmaddy Ты прав, ответ был очень общим. Но вопрос, который у него есть, связан с контентом. В следующий раз я постараюсь быть более точным. – Markus

Смежные вопросы