我无法理解“网络字节序”的概念。我读过Network byte order and endianness issues , 但仍然不能。
现在,我对两台计算机之间通过 TCP 套接字进行的通信进行了正式的网络协议(protocol)描述。这是短语“...使用小端字节序”。但是标准的网络字节顺序是大端。
我是否应该考虑字节顺序,如果在网络的两侧都完全定义了字节顺序,并且我粗略地说,void*
和 size
?网络如何“知道”我的数据? float 类型呢?
比如我这边是否不能写:
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 位值表示为小端(intel 等):
地址偏移量 0 1 2 3
位 0-7 位 8-15 位 16-23 位 24-31
并以网络字节顺序或大端(motorola cpus 等)表示:
地址偏移量 0 1 2 3
位 24-31 位 16-23 位 8-15 位 0-7
根据您最初学习编写机器代码的架构(如果您学习过),其中一个对您来说比另一个更有意义。对于几乎所有 45 岁以下的人来说,这将是与网络字节顺序相反的小端字节序。
如果你像我一样学会了在德州 TMS9900 架构上编写机器代码,那就更令人困惑了,因为在德州,第 0 位是最高有效位 (!)
更新:
一般来说,最好以独立于硬件或编译器实现选择甚至语言的方式在线上编码数据。
这是来自谷歌 Protocol Buffer 的此类编码示例:
https://developers.google.com/protocol-buffers/docs/encoding
这里的优点是:
通常传输的流量较少,因此网络速度较快
无论硬件、编译器版本,甚至语言如何,连接的每一端都会理解数据。
关于c++ - 我应该考虑网络字节顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46070716/