【问题标题】:How should I read reverse-order bytes in C?我应该如何在 C 中读取逆序字节?
【发布时间】:2014-06-16 01:01:15
【问题描述】:

我需要读取与本机顺序相反的 unsigned char * 字节。目前我有很多小程序,大致如下:

uint8_t * bytes;
uint32_t r;
bytes = pt;
r = (((((bytes[0] << 8) + bytes[1]) << 8) + bytes[2]) << 8) + bytes[3];
pt += 4;
return r;

是否有标准或可移植的方式来完成这种工作,还是我必须破解这样的功能?

【问题讨论】:

  • @WhozCraig - 我从某个地方记得你的名字,你似乎喜欢跳到人身上。跟网络秩序无关,哪里说网络秩序?字节来自 TrueType 字体文件。

标签: c endianness standard-library


【解决方案1】:

适用于您平台的套接字库提供了以下执行这些转换的函数:

  • ntohs - 网络到主机短(16 位)
  • htons - 主机到网络短(16 位)
  • ntohl - 网络到主机长(32 位)
  • htonl - 主机到网络长(32 位)

要实现上面的代码,您可以:

r = ntohl(*(uint32_t *)bytes);

【讨论】:

  • 这些函数看起来可能很有用,但实际反转是在 TrueType 字体内,而不是“网络顺序”。我不确定是否应该使用“网络字节顺序”来代替“TrueType 字体字节顺序”。我会检查一下,看看这是否适合问题。
  • @ChewyDragees:“网络字​​节顺序”被定义为大端(最高有效字节在前)。您可能会发现 TrueType 字节顺序与网络字节顺序相同。
  • 我确实找到了。谢谢格雷格,这是正确的答案。
  • 虽然不做 uint64_t。我想我可以做到我自己。
  • @ChewyDragees 用于 64 位字节序转换,您可以在 Windows 上使用 ntohll 和一些 Unix 实现。对于其他一些您需要使用htole64betoh64
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 2014-03-03
  • 2012-10-04
  • 2014-12-04
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多