gpt4 book ai didi

c++ - 如何以标准方式从未对齐的内存中获取值?

转载 作者:行者123 更新时间:2023-11-30 04:26:00 27 4
gpt4 key购买 nike

我知道 C++11 有一些标准工具可以从未对齐的内存中获取整数值。怎么能用更标准的方式来写这样的东西呢?

template <class R>
inline R get_unaligned_le(const unsigned char p[], const std::size_t s) {
R r = 0;
for (std::size_t i = 0; i < s; i++)
r |= (*p++ & 0xff) << (i * 8); // take the first 8-bits of the char
return r;
}

要获取以 litte-endian 顺序存储的值,您可以这样写:

uint_least16_t value1 = get_unaligned_le<uint_least16_t > (&buffer[0], 2);
uint_least32_t value2 = get_unaligned_le<uint_least32_t > (&buffer[2], 4);

最佳答案

整数值是如何进入未对齐内存的?如果它们是 memcpy 编辑的,那么您可以使用 memcpy 将它们取出。如果它们是从文件或网络中读取的,你必须知道它们格式:它们是如何开始的。如果它们是四个字节big-endian 2s 补码(通常的网络格式),然后是喜欢:

//      Supposes native int is at least 32 bytes...
unsigned
getNetworkInt( unsigned char const* buffer )
{
return buffer[0] << 24
| buffer[1] << 16
| buffer[2] << 8
| buffer[3];
}

这将适用于任何无符号类型,前提是您要瞄准的类型for 至少与您输入的类型一样大。对于签名,这取决于关于您想要的便携性。如果你所有的潜在目标机器是 2 的补码,并且将具有整数类型与您的输入类型大小相同,那么您可以使用与多于。如果您的本地机器是 1 的补码 36 位机器(例如Unisys 大型机),并且您正在读取带符号的网络格式整数(32 位 2 的补码),您需要一些额外的逻辑。

关于c++ - 如何以标准方式从未对齐的内存中获取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11774048/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com