c++ - reinterpret_cast 上的字节顺序

标签 c++ endianness reinterpret-cast uint16

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

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

输出有错误的字节顺序,有没有办法指定 reinterpret_cast如果我想在小端或大端上进行操作?

谢谢!

最佳答案

I have a pointer to an uint8_t aray. Each 2 elements are actually a uint_16_t

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

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

通过重新解释指针进行间接操作将具有未定义的行为,因为在指向的地址处没有 uint16_t 对象。

即使您禁用严格别名,仍然存在 UB,除非您保证字节数组对 uint_16_t 充分对齐。

is there a way to specify reinterpret_cast if I want to do it on little or big endian?

没有。数据始终以 native 字节顺序重新解释。如果输入字节具有不同的字节顺序,那么结果将是“错误的”。

您必须知道输入数据的字节顺序。通过移位和屏蔽,您可以在不知道 native 字节序的情况下将字节作为多字节整数读取。

关于c++ - reinterpret_cast 上的字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58695483/

相关文章:

c++ - 如何检测端口是否已在服务器端使用(在 Windows 上的 C++ 中)?

c++ - 更正代码 c++ 指针和删除

c++ 构造函数和初始化程序行为。这5个代码有什么区别?

c++ - 仅在优化的 Win32 构建 (XMMATRIX) 中出现 AccessViolation

c - 通过套接字发送任意长度的数组。字节顺序

c - 64 位算法在 32 位应用程序中提供错误输出

c++ - 有效地在小端和大端 float 之间转换

c++ - reinterpret_cast/static_cast 和未定义的行为

c++ - 了解神秘的C++语句

c++ - 使用 reinterpret_cast 将数据从 std::vector<double> reshape 为指定维度的 double**