首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Endianness转换C++

Endianness转换C++
EN

Stack Overflow用户
提问于 2013-10-25 20:21:01
回答 4查看 2K关注 0票数 5

我试图解码从大端机器发送到解码器的一些数据,解码器位于一个小终端机器上。我没有很好地处理过这个问题,我觉得自己很困惑。

我使用位集来打印我的数据,这样我就可以准确地看到它对于特定的32位结构是如何产生的,并且我可以看到我需要的数据在位序列的中间。

现在,我知道如果你有一个32位的值,从大到小,你会反转字节的顺序。如果我这样做,我的数字不会在我期望的地方结束(手工完成)。

举个例子。我有一个32位未签名的整数。我知道它来自我的大端机器0x50000000。当我使用小终端机器cout << "packSpare 32: " << bitset<32>(Data.pack_Spare).to_string() << endl;上的位集打印这个文件时,我得到了0x00005000。所以它看起来更像是按顺序交换了前两个字节和第二个字节。

我原来有一个这样的结构:

代码语言:javascript
复制
#pragma pack(push, 1)
    struct PACK_SPARE
    {
        int         Spare3:28;
        int         Heading_Reference:1;
        int         Spare2:1;
        int         H_Valid:1;
        int         Spare5:1;
    };
    #pragma pack(pop)

这是从大端机器发送的相反的顺序,但是我注意到了关于一些明显的比特交换发生的问题,所以我想把整件事情拉进32位,然后交换,然后打印数据。现在我只是在使用int pack_Spare;

它只是取两个16位块,并交换它们,而不是对整个32位值进行交换吗?抱歉,如果这没有道理,就像我说的,我有点困惑。

编辑这个数据不是通过网络来的。我正在从视频文件中传输数据。我将这些数据存储到相应的值中。所以我想我的问题是,如果我有一个32位int,然后把数据放到那个变量中,如果我使用位集,为什么它要交换32位int的两个16位组,而不是字节?我期待0x50000000,但我得到0x00005000 (0000和5000被交换,而不是我期望的典型的endian交换,它颠倒了所有字节的顺序)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-10-25 21:10:35

虽然除了介绍之外,我不经常推荐维基百科,但我在这里确实找到了一个很好的http://en.wikipedia.org/wiki/Endianness,(在回答您的问题时,为什么要交换32位int的两个16位组,而不是按字节进行?)。

讨论发生在该链接页面的2/3以下.寻找这个:

在同一页上有一些关于endian的有趣的事情。

票数 2
EN

Stack Overflow用户

发布于 2013-10-25 20:24:23

只需使用hton()和co。为了在网络和本机字节顺序之间进行转换,然后应用实际的按位运算,例如移位和掩蔽。您不需要占用即时的内存访问权限。

票数 5
EN

Stack Overflow用户

发布于 2013-10-25 20:26:27

您需要在发送时转换为网络字节排序(使用htonX()),然后在读取时(使用ntohX())将其转换回来。

注意:提供的链接是Windows版本的函数。不过,POSIX系统也有类似的签名。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19598771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档