- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我正在从流中读取和写入 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 可以通过将这些细节隐藏在移位操作后面来处理字节顺序。这是真的吗?如果不是,谁能解释一下为什么?
最佳答案
If I read/write one byte at a time to/from a stream and shift each byte like the below examples, will the results be consistent regardless of machine endianness?
是的。你的s_write_uint32()
函数按从最低有效到最高有效的顺序存储输入值的字节,而不管它们在该值的 native 表示中的顺序如何。你的s_read_uint32()
无论 uint32_t
的底层表示如何,都正确地反转了这个过程.这些工作是因为
<<
、>>
)的行为是根据左操作数的值定义的,而不是其表示& 0xff
屏蔽掉左操作数的所有位,但不考虑其最低有效字节的位,而不管值的表示形式如何(因为 0xff
具有匹配的表示形式),并且|=
操作只是将字节放入结果;这些位置是通过前面的左移适本地选择的。如果 +=
这可能会更清楚被改用了,但结果不会有什么不同。但是请注意,在某种程度上,您是在重新发明轮子。 POSIX 定义了一个函数对 htonl()
和 nothl()
-- 许多非 POSIX 系统也支持 -- 用于处理四字节数字中的字节顺序问题。这个想法是,发送时,每个人都使用 htonl()
从主机字节顺序(无论是什么)转换为网络字节顺序(大端)并发送生成的四字节缓冲区。收到后,每个人都接受四个字节为一个数字,然后使用 ntohl()
将网络字节顺序转换为主机字节顺序。
关于c - 无论值大小如何,一次读取一个字节字节顺序是不可知的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56385192/
我是一名优秀的程序员,十分优秀!