C++ Qt间期与经度

C++ Qt间期与经度,c++,qt,sockets,networking,endianness,C++,Qt,Sockets,Networking,Endianness,我正在编写一个程序,使用QUdpSocket通过网络传输数据。这是我的第一个socket程序,我遇到了一个有趣的问题,叫做Endianness 我的实际问题是,当我使用QNetwork作为套接字库时,是否需要担心Endianness?如果我真的要担心,我该怎么做才能正确避免持久性问题 提前感谢。如果您要在两台具有不同终端的机器之间传输二进制数据,您可能需要担心 网络套接字只会原封不动地发送数据。如果其他机器假定它发送的字节是按特定顺序排列的,则必须对此进行管理 如果您正在以已知格式传输数据,如图

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

我的实际问题是,当我使用QNetwork作为套接字库时,是否需要担心Endianness?如果我真的要担心,我该怎么做才能正确避免持久性问题


提前感谢。

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

网络套接字只会原封不动地发送数据。如果其他机器假定它发送的字节是按特定顺序排列的,则必须对此进行管理

如果您正在以已知格式传输数据,如图像,则图像格式的标题中通常会显示写入顺序,读写器库将处理该顺序。 如果你正在发明自己的二进制格式,那就由你自己决定了。您可能还必须考虑大小,在另一台机器上有多少字节是int?
好消息是,大多数计算机都是英特尔的,对于大多数以ascii格式传输少量数据的应用程序来说,这是可行的。

一般来说,在将大于一个字节的整数从一台计算机传输到另一台计算机时,需要担心字节顺序。在C/C++中,这意味着如果要发送16位、32位或64位整数,则需要首先将整数转换为网络字节顺序(也称为Big-Endian)。然后,接收端的计算机必须将传入的整数转换为主机字节顺序,即主机本机使用的任何字节顺序。这通常是通过使用
htons
ntohs
系列库函数来实现的,但是对于Qt库,您也可以使用
qToBigEndian
qFromBigEndian
函数


请注意,在发送ASCII或UTF-8文本时,您不必担心端号,因为这些格式由单个字节序列组成,而不是多字节数据类型。

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

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


查看是否有关于大端性的信息。

这里有一个简单的大端性测试,以防您需要:

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

静态常量int testValue=1

#定义为_bigendian()((char)和testValue)==0)

布尔CD是bigendian(void) { 返回是_bigendian();
}

我知道这个问题很久以前就得到了回答,但我只是想补充一下

您可以使用该功能(与任何QIODevice一起使用),而不是使用endian转换函数,在我看来,这更简单、更直观。当然,这会限制您在发送方和接收方上使用QDataStream,但在这种情况下,这是值得的

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

QDataStream&operator>(QDataStream&stream、QImage&image)
(这两个都已经在Qt中实现了。)

qtcsocket*tcp=
QImage img=

QDataStream(tcp)Intel CPU使用little-endian——它不是操作系统的一个功能。如果说Windows使用little-endian,而“其他所有”都使用Big-endian,这是一种误导。端性是处理器体系结构的属性,而不是操作系统。大多数家用电脑都是小端数,因为英特尔和AMD x86处理器都是小端数。这包括运行Linux或Windows以外的其他操作系统的x86机器。是的,Intel Mac是little endian,PowerPC是big endian(芯片是可切换的,但Mac使用本机模式),ARM(iStuff)是实现定义,但这样做并不总是必要或明智的,如果您正在流式传输视频,将每个字节转换为HTON然后再转换回来是没有意义的-最好有一个代码,以便接收机器知道数据的方向。错了,UTF-8是可变宽度编码,保证表示每个unicode字符,因此最多可以占用4个字节。不,你的理解是错误的。UTF-8是可变宽度编码,但它不受endianness的影响,因为可变长度字符由有序字节序列组成,而UTF-16或UTF-32的最小单位是2(或4)字节的二进制整数,其字节顺序由体系结构endianness决定。对于将来引用它的人,你可能认为你想要它,但实际上你并不想: