作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道 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/
背景 我最近在 merge 期间遇到了一个意外未 merge 的文档文件的问题。 无论出于何种原因,我搞砸了 merge 并有效地删除了文件(和其他几个文件),因为我忘记了它们的存在。 现在我想查看我
我在我的网站上使用旧的 mysql 版本和 php 版本 4。 我的表结构: | orders_status_history_id | orders_id | orders_status_id |
我是一名优秀的程序员,十分优秀!