interpret_cast的持久性

Endianness on reinterpret_cast

本文关键字:持久性 cast interpret      更新时间:2023-10-16

我有一个指向uint8_t aray的指针。每两个元素实际上都是uint_16_t值,我想使用reinterpret_cast:

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

输出的端序错误,如果我想在小端序或大端序上指定reinterpret_cast,有没有方法?

谢谢!

我有一个指向uint8_t aray的指针。每两个元素实际上是一个uint_16_t

要么实际上有一个uint8_t的数组,要么实际上有uint_16_t的数组。不可能两者兼而有之。

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

由于在所指向的地址处没有uint16_t对象,因此通过重新解释指针进行分离将具有未定义的行为。

即使禁用了严格混叠,也仍然存在UB,除非您保证字节数组对uint_16_t足够对齐。

如果我想在little或big endian上执行,有没有一种方法可以指定reinterpret_cast?

否。数据总是以本机端序重新存储。如果输入的字节具有不同的字节序,那么结果将是"错误的"。

您必须知道输入数据的字节序。您可以将字节读取为多字节整数,而无需通过移位和屏蔽来了解本机端序。