代码之家  ›  专栏  ›  技术社区  ›  cake

qt窝和端部

  •  6
  • cake  · 技术社区  · 14 年前

    我正在写一个程序,它使用qudpsocket通过网络传输数据。这是我的第一个socket程序,我遇到了一个有趣的问题,叫做endianness。

    我的实际问题是,当我使用qnetwork作为sockets库时,是否需要担心endianness?如果我真的要担心,我该怎么做才能避免永久性的问题呢?

    提前谢谢。

    5 回复  |  直到 13 年前
        1
  •  11
  •   Charles Salvia    14 年前

    一般来说,当从一台计算机向另一台计算机传输大于一个字节的整数时,您需要担心endianness(字节顺序)。在C/C++中,这意味着如果你发送的东西类似于16位、32位或64位整数,则需要首先将整数转换为 网络字节顺序 ,(也称为big endian)。接收端的计算机必须将输入的整数转换为 主机字节顺序 ,这是主机本机使用的任何字节顺序。通常使用 htons ntohs 一系列库函数,但使用qt库还可以使用 qToBigEndian qFromBigEndian 功能。

    请注意,在发送ascii或utf-8文本时不需要担心端点,因为这些格式由单个字节的序列组成,而不是由多字节数据类型组成。

        2
  •  2
  •   Martin Beckett    14 年前

    如果要在两台具有不同端点的计算机之间传输二进制数据,您可能需要担心。

    网络套接字只会以不变的方式发送数据。如果其他机器假设它发送的字节是按特定顺序发送的,则必须对其进行管理。

    如果要以已知格式(如图像)传输数据,则图像格式通常会在标题中显示数据的写入顺序,并且读写器库将对其进行处理。 如果你正在发明你自己的二进制格式-那就取决于你了。您可能还需要考虑大小,另一台机器上的int是多少字节?

    好消息是,大多数机器都是intel,对于大多数应用程序来说,以ascii格式传送少量数据是可行的。

        3
  •  1
  •   Bruce    14 年前

    这里有一个简单的测试Big Endianness,如果你想要的话:

    //此测试假定int大小至少为2。

    静态const int testvalue=1;

    #define是\u bigendian()。(( (炭) )&测试值(amp;T)==0)

    bool cd_is_bigendian(无效) { 返回是_bigendian(); }

        4
  •  1
  •   ianmac45    13 年前

    我知道这是很久以前的答案了,但我只是想补充一下。

    您可以使用 QDataStream 功能(带 任何 秋德维),也就是 许多的 在我看来更简单更直观。当然,这会使您锁定在发送方和接收方上使用qdatastream,但在这种情况下这是值得的。

    示例用法,对于其他人发送图像的示例:

    QDataStream & operator<< (QDataStream& stream, const QImage& image);
    QDataStream & operator>> (QDataStream& stream, QImage& image);
    (这两个都已经在qt中实现了。)

    QTcpSocket *tcp = ...;
    QImage img = ...;
    QDataStream(tcp) << img;

        5
  •  0
  •   Paul Kelly    14 年前

    英特尔CPU使用小Endian。其他大部分都是大端的。默认的网络字节顺序是big endian。

    要测试endianness是否有问题,请发送值0x12345678并检查其是否与0x78563412相同。如果接收计算机上的值是后一个值,则两个系统之间的端点不相同。

    检查 this wikipedia article 关于Endianness的信息。