gpt4 book ai didi

c - 无论值大小如何,一次读取一个字节字节顺序是不可知的吗?

转载 作者:太空狗 更新时间:2023-10-29 17:02:48 25 4
gpt4 key购买 nike

假设我正在从流中读取和写入 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/

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