gpt4 book ai didi

c++ - native 字节序和自动转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:49 25 4
gpt4 key购买 nike

所以以下将大端转换为小端

uint32_t ntoh32(uint32_t v)
{
return (v << 24)
| ((v & 0x0000ff00) << 8)
| ((v & 0x00ff0000) >> 8)
| (v >> 24);
}

有效。就像一个魅力。

我从一个大端文件中读取 4 个字节到 char v[4] 并将它传递给上面的函数作为

 ntoh32 (* reinterpret_cast<uint32_t *> (v))

那行不通 - 因为我的编译器 (VS 2005) 在我执行转换时自动将大端 char[4] 转换为小端 uint32_t

AFAIK,这种自动转换将不可移植,所以我使用

uint32_t ntoh_4b(char v[])
{
uint32_t a = 0;
a |= (unsigned char)v[0];
a <<= 8;
a |= (unsigned char)v[1];
a <<= 8;
a |= (unsigned char)v[2];
a <<= 8;
a |= (unsigned char)v[3];
return a;
}

是的,(unsigned char) 是必需的。是的,它很慢。

一定有更好的方法。有人吗?

最佳答案

恕我直言,更好的方法是使用 htonlntohl 函数。如果你想真正便携,你就不能考虑“转换为小端”。相反,您应该考虑“转换为主机字节序”。这就是 ntohl 的用途,如果您的输入肯定是 big-endian(这是网络标准)。

现在,如果你单独读取你的字节,你可以将它们作为一个无符号的 long 来读取(在二进制模式下)——这应该给你一个 big-endian long,然后你可以将它转换成你需要的任何东西——如果你需要的话主机字节序,然后是 ntohl

关于c++ - native 字节序和自动转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2528274/

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