【发布时间】:2019-05-31 07:01:14
【问题描述】:
假设我正在从流中读取和写入 uint32_t 值。如果我一次向/从流中读取/写入一个字节并像下面的示例一样移动每个字节,无论机器字节序如何,结果都会保持一致吗?
在此处的示例中,流是内存中称为p 的缓冲区。
static uint32_t s_read_uint32(uint8_t** p)
{
uint32_t value;
value = (*p)[0];
value |= (((uint32_t)((*p)[1])) << 8);
value |= (((uint32_t)((*p)[2])) << 16);
value |= (((uint32_t)((*p)[3])) << 24);
*p += 4;
return value;
}
static void s_write_uint32(uint8_t** p, uint32_t value)
{
(*p)[0] = value & 0xFF;
(*p)[1] = (value >> 8 ) & 0xFF;
(*p)[2] = (value >> 16) & 0xFF;
(*p)[3] = value >> 24;
*p += 4;
}
我目前无法访问大端机器来测试这一点,但我的想法是,如果每个字节一次写入一个,则每个单独的字节都可以从流中独立写入或读取。然后 CPU 可以通过将这些细节隐藏在移位操作后面来处理字节顺序。这是真的吗,如果不是,请任何人解释为什么不?
【问题讨论】:
-
你的直觉是正确的。
-
是吗?在我看来,
(*p)[0]指的是小端机器上的最低有效字节,但指的是大端机器上的最高有效字节。 -
@500-InternalServerError 这很好。由于他不将
p的值读取为32 位整数,因此如果将值读取为32,则实现将其视为最低有效字节还是最高有效字节都没有关系-位整数。 -
32 位值的第 0...7 位始终包含其值的 8 个最小 sig 位。字节序是指这 32 位是如何存储在内存中的。
-
是的,一次读取一个 byte 是 byte-order 不可知的。但是,您的 代码 不是字节顺序不可知的,整数的字节以严格的小端顺序存储和读取。
标签: c endianness