我无法理解"网络字节顺序"的概念。我已经阅读了网络字节订单和终结性问题,但仍然不能。
现在,我对TCP插座上两台计算机之间的通信进行了正式的网络协议描述。这是" ...使用小型字节订单"一词。但是标准的网络字节订单是大端的。
我是否应该考虑一个字节订单,如果在网络的两侧,字节订单已完全定义,然后我写大致说话, 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
32位值表示为小ordian(intel等):
address offset 0 1 2 3
bits 0-7 bits 8-15 bits 16-23 bits 24-31
并在网络字节订单或大端(摩托罗拉CPU等)中表示:
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
这里的优点是:
-
通常会更少传输的流量,因此网络
-
连接的每个末端都会理解数据,无论硬件,编译器版本甚至语言如何。
tcp-socket只是一个字节流,根本不在乎您发送的数据的终点。因此,对于您自己的私人网络协议,您可以使用您喜欢的任何字节订单。如果所有使用该协议的计算机都具有相同的天然字节顺序,则将其用作序列化顺序可能是一个好主意,因为这允许您像第二个示例一样编写代码。