NSArray и endianness

У меня есть эта часть кода

NSMutableData *mData = [NSMutableData data];

uint16_t bytes = 0x9F21;
[mData appendBytes:&bytes length:sizeof(bytes)];

Когда я печатаю байты с помощью p/xi get

0x9F21

Если я пытаюсь установить mData, я получаю

<219f>

Это проблема, связанная с упорядочением байтов, я видел, что если я конвертирую порядок байтов, mData правильно сохраняет байты

Если я напечатаю объект mData с помощью этого кода, я получу ожидаемое значение

NSMutableData *mData = [NSMutableData data];

uint16_t bytes = CFSwapInt16HostToBig(0x9F21);
[mData appendBytes:&bytes length:sizeof(bytes)];

Это означает, что appendBytes требует большого эндиантного заказа как на маленьких, так и на больших концах арки?

2 ответа

appendBytes будет принимать байт в том порядке, в котором они находятся внутри указателя буфера, который вы передаете методу. Он не требует и не предполагает каких-либо конкретных порядков endiannes.

Вы должны преобразовать ваш int "endianness" в соответствии с порядком байта, который вы хотите в NSData. Или не используйте int_16, если вас интересуют только байты и непосредственно хранят байты. Трудно дать больше советов без знания данных, которые нужно сохранить.


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

Все время, когда данные находятся в вашем приложении, и вам нужно манипулировать, вам нужно сохранить данные в его родной форме, которая на самом деле обрабатывается как big-endian (т. 0x9f то вроде bytes >> 8 даст 0x9f).

Когда я печатаю байты с помощью p/xi get

0x9F21

Это печатает 16-разрядное целое число без знака в собственном формате (LLDB знает, что это 16-разрядный тип)

Если я пытаюсь установить mData, я получаю

<219f>

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

licensed under cc by-sa 3.0 with attribution.