C++ 如何将uint32存储在uint8数组中

C++ 如何将uint32存储在uint8数组中,c++,C++,我必须将一组uint32\u t值序列化为uint8\u ts数组。如何以便携高效的方式实现这一点?虽然可以通过cstdint访问uint32\u t和uint8\u t(标准C),但不能保证它们确实存在。C标准规定,如果它们存在,它们应该正好是位数。例如,它们可能在36位和其他奇数平台上丢失 除此之外,这只是一个通过算术转换的问题: hi = (x >> 24) & 0xFF; ji = (x >> 16) & 0xFF; ko = (x >>

我必须将一组
uint32\u t
值序列化为
uint8\u t
s数组。如何以便携高效的方式实现这一点?

虽然可以通过
cstdint
访问
uint32\u t
uint8\u t
(标准C),但不能保证它们确实存在。C标准规定,如果它们存在,它们应该正好是位数。例如,它们可能在36位和其他奇数平台上丢失

除此之外,这只是一个通过算术转换的问题:

hi = (x >> 24) & 0xFF;
ji = (x >> 16) & 0xFF;
ko = (x >> 8) & 0xFF;
lo = (x >> 0) & 0xFF;
同样,反过来说:

x = (hi << 24ul) | (ji << 16ul) | (ko << 8ul) | (lo << 0ul);

x=(嗨操纵原始字节数组的可移植方法是
std::memcpy
char
缓冲区

uint32_t toBeSent = 42;
char buffer[sizeof toBeSent];

std::memcpy(&buffer, &toBeSent, sizeof toBeSent);
sendBuffer(buffer);

// ...

uint32_t toBeReceived;
char buffer[sizeof toBeReceived];

receiveBuffer(buffer);
std::memcpy(&toBeReceived, &buffer, sizeof toBeReceived);

你不能,因为
u32_t
u8_t
不是标准类型。你需要处理端点问题吗?@Quentin,因为它需要在具有不同端点的平台上工作可能是的。@TNA在不同平台上或不同平台之间?当发射器和接收器的端点不同时,问题就会出现顺便问一下:这个问题有什么问题吗?4张反对票,但noc解决方案,没有解释。谢谢你指出这一点。我更新了我的答案以考虑到这一点。真正的问题当然是你不能保证在一个具有这些整数宽度的平台上。请注意,
char
不能保证精确为8b是的。对于一个实现来说,拥有
char
和所有相同宽度的整数类型是完全有效的。@skyking ergo如果
uint8\u t
不是
char
,那么用
uint8\u t
就没有可移植的方法了。但是OP很可能真的想要
char
s.@Quentin这仍然不可移植,因为Ndianes在代码中被忽略。@πάνταῥεῖ 请参阅问题下方的评论。我确保endianness在OP的案例中不是一个问题(没有跨平台沟通)。