Какао (или, если быть точным, базовая структура) имеет функции для замены байтов байтов: NSSwapInt
, NSSwapShort
, NSSwapLong
и NSSwapLongLong
.Они обмениваются вокруг байтов, независимо от того, что - они делают целые числа с прямым порядком байтов из целых чисел с прямым порядком байтов и наоборот.
Если вы знаете, какой у вас формат, есть другие функции, которые меняют его на собственный порядок байтов: NSSwapLittleIntToHost
и NSSwapBigIntToHost
.Есть также обратные функции, которые меняют местный формат на формат с прямым или обратным порядком байтов: NSSwapHostIntToLittle
и NSSwapHostIntToBig
.Они также доступны для других целочисленных типов и типов с плавающей точкой.То, что они делают, они при необходимости вызывают примитивные функции подстановки значений.Так что NSSwapLittleIntToHost
ничего не делает, в то время как NSSwapBigIntToHost
возвращает результат NSSwapInt
на машине с прямым порядком байтов.
Обратите внимание, что они принимают параметры целочисленных типов компиляторов, а не типа NSInteger
.Таким образом, в зависимости от того, генерируете ли вы 32-битный или 64-битный код, вы должны использовать разные функции, если вы используете NSInteger
.
Вы также не должны приводить свой байтовый массив к целочисленному указателю и разыменовывать его.Было бы лучше собрать целое число, используя операции сдвига битов.Ваш код будет работать, только если NSInteger
имеет ширину 32 бита.Если он 64-битный, то ваш номер будет мусором, иначе ваша программа может даже зависнуть.Но даже если вы используете целочисленный тип, который всегда имеет ширину 32 бита (например, int32_t
из заголовка C99 <stdint.h>
), это может работать не так, как ожидается.