Endianness на reinterpret_cast - PullRequest
       65

Endianness на reinterpret_cast

0 голосов
/ 04 ноября 2019

У меня есть указатель на массив uint8_t. Каждые 2 элемента на самом деле представляют собой значение uint_16_t, и я хочу использовать reinterpret_cast:

uint16_t *Dst16Rgb = reinterpret_cast<uint16_t*>(Dst8Rgb);

Выход имеет неправильный порядок байтов, есть ли способ указать reinterpret_cast, если яхотите сделать это на маленьком или большом порядке байтов?

Спасибо!

1 Ответ

1 голос
/ 04 ноября 2019

У меня есть указатель на массив uint8_t. Каждые 2 элемента на самом деле представляют собой uint_16_t

Либо у вас есть массив uint8_t, либо у вас действительно массив uint_16_t. Это не может быть и другое.

uint16_t *Dst16Rgb = reinterpret_cast<uint16_t*>(Dst8Rgb);

Непрямое обращение через указатель переинтерпретации будет иметь неопределенное поведение, поскольку по указанному адресу нет объекта uint16_t.

Даже еслиВы отключаете строгий псевдоним, UB все еще существует, если только вы не гарантируете, что байтовый массив достаточно выровнен для uint_16_t.

, есть ли способ указать reinterpret_cast, если я хочу сделать это на маленьком или большомendian?

Нет. Данные всегда реинтерпретируются с прямым порядком байтов. Если входные байты имеют различные порядковые номера, тогда результат будет «неправильным».

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

...