我应该考虑网络字节顺序吗?

时间:2017-09-06 08:50:49

标签: c++ qt tcp network-programming endianness

我无法理解“网络字节顺序”的概念。我看过Network byte order and endianness issues,但仍然不能 现在,我通过TCP套接字为两台计算机之间的通信制作了正式的网络协议描述。这是短语“...使用little-endian字节顺序”。但标准的网络字节顺序是big-endian。

我是否应该考虑一个字节顺序,如果在网络的两边,字节顺序是完全定义的,我写,大致说,void*size?网络如何“了解”我的数据?浮动类型怎么样?

例如,我是否不能写在我身边:

stream.setDevice(tcpSocket);
stream.setByteOrder(QDataStream::LittleEndian);
...

struct SomeType
{
    int32_t a;
    int32_t b;
    double c;

    friend QDataStream& operator << (
        QDataStream& stream, const SomeType& x)
    {   
        stream << x.a
            << x.b
            << x.c;

        return stream;
    }        
};

或者可能只是:

SomeType x;
tcpSocket.write(&x, size); // If known a byte order and a data structure alignment on both sides

2 个答案:

答案 0 :(得分:2)

32位值表示为little-endian(intel等):

address offset 0 1 2 3 bits 0-7 bits 8-15 bits 16-23 bits 24-31

以网络字节顺序或big-endian(motorola cpus等)表示:

address offset 0 1 2 3 bits 24-31 bits 16-23 bits 8-15 bits 0-7

根据您第一次学习编写机器代码的架构(如果您这样做),您将比另一个更有意义。对于几乎45岁以下的人来说,它将是小端,与网络字节顺序相反。

如果你学会在像我这样的德州TMS9900架构上编写机器代码,那就更加困惑了,因为在德克萨斯州,第0位是最重要的位(!)

更新

通常,最好以独立于硬件或编译器实现选择甚至语言的方式对线路上的数据进行编码。

以下是Google协议缓冲区中此类编码的示例:

https://developers.google.com/protocol-buffers/docs/encoding

这里的优点是:

  1. 通常传输的流量较少,因此网络速度更快

  2. 无论硬件,编译器版本甚至语言如何,连接的每一端都将理解数据。

答案 1 :(得分:1)

TCP套接字只是一个字节流,并不关心您发送的数据的字节顺序。因此,对于您自己的专用网络协议,您可以使用您喜欢的任何字节顺序。如果使用该协议的所有计算机具有相同的自然字节顺序,则最好将其用作序列化顺序,因为这允许您编写类似第二个示例的代码。