从char*缓冲区读取int32_t的惯用cpp14方法是什么?

Pie*_*rot 6 c++ endianness c++14

给定一个包含int(小端)的char缓冲区c.如何将其读作int32_t?

我写了这段代码,但感觉不是惯用的cpp.

int32_t v;
char* p = (char*)&v;
for (int i=0; i < 4; i++) {
    *(p+i) = *(c+i);
}
Run Code Online (Sandbox Code Playgroud)

n. *_* m. 7

二进制数据从char*缓冲区复制到任何其他数据类型的唯一可移植方式是memcpy(或等效的字节复制方法,例如std::copy您自己的模仿此行为的方法).

 memcpy(&my_number, my_buffer, sizeof(my_number));
Run Code Online (Sandbox Code Playgroud)

当然缓冲区应该包含给定数据类型的正确位.如果它来自内存复制同一台计算机上的相同数据tyoe,那么字节序不发挥作用.否则,您必须按所需顺序重新排列字节(在适当的位置或在临时缓冲区中),或者以平台相关的方式在整数本身中交换字节(可能使用htonl和朋友).


Dút*_*has 6

没有神奇的惯用方法来处理字节序 - 字节序是一个I/O问题.使用htonl()ntohl()功能(在每个系统上可用)或者只是自己解码(正如你所做的那样).我建议写功能(让你的生活更轻松,更可验证).


Vit*_*meo 5

如果你想解决您的问题在便携和安全的方式,使用memcpy作为纳米的答案解释.否则,这是一个更危险的技术:

请注意,这是UB.如果您完全确定缓冲区包含适量的数据并且缓冲区和数据已正确对齐,请仅使用下面的技术.

如果您确定系统的字节顺序与存储在char*缓冲区中的数据之一匹配,则可以使用reinterpret_cast:

std::int32_t v = *reinterpret_cast<std::int32_t*>(p);
Run Code Online (Sandbox Code Playgroud)

进行上述转换没有符合标准的方法.有关详细信息,请参阅此问题.

  • 重新解释强制转换不适用于未正确对齐的数据.行为未定义. (7认同)