网络应用时的字节序问题

网络应用时的字节序问题,第1张

网络应用时的字节序问题,第2张

网络应用中数据接收方的代码。这段代码用于从用C++编写的应用程序接收数据,其中一个数据项是整数。这是在代码中完成的:接收后,数据流中的整数按字节顺序转换,第0个字节与第3个字节互换,第1个字节与第2个字节互换。和程序员沟通后,他坚定的告诉我,不这样改数据是不对的,我也不知道为什么。
要理解这个问题,我们需要从BIG-ENDIAN、LITTLE-ENDIAN、主机字节序、网络字节序、JAVA字节序入手,然后再分析上述问题。
1。Big-endian和LITTLE-ENDIAN与多字节数据相关,如int、short和long,但对单字节数据字节没有影响。BIG-ENDIAN是指低位字节放在内存低端,高位字节放在内存高端。而LITTLE-ENDIAN正好相反。
例如,int a = 0x05060708
存储为:
字节数0 1 2 3
数据05060708
在LITTLE-ENDIAN的情况下存储为:
字节数。数据08 07 06 05
2。大端,小端,与CPU相关,每种CPU不是大端就是小端。IA架构的CPU是小端的,而PowerPC、SPARC、摩托罗拉处理器。这其实就是所谓的主机字节顺序。网络字节序是指数据在网络上传输时是大还是小,互联网上的网络字节序是BIG-ENDIAN。JAVA endian是指多字节数据在JAVA虚拟机中的存储顺序,JAVA endian也是BIG-ENDIAN。
3。因此,在用C/C++编写通信程序时,在发送数据之前,我们必须使用htonl和htons将整数和短数据从主机字节顺序转换为网络字节顺序,而在接收数据之后,我们必须调用ntohl和ntohs来实现从网络字节顺序到主机字节顺序的转换。如果通信方是JAVA程序,通信方是C/C++程序,就需要在C/C++端使用上述方法进行字节顺序转换,而在JAVA端,不需要做任何处理,因为JAVA字节顺序和网络字节顺序都是BIG-ENDIAN,只要C/C++端能正确进行转换(发送前从主机顺序到网络顺序,接收时反向转换)。如果通信双方都是JAVA,那就完全不需要考虑字节顺序。
4。如果网络上所有的主机都是PowerPC、SPARC、摩托罗拉CPU,就不会有问题。但由于IA架构CPU数量较多,经常会出现数据传输错误。
5。文章开头提出的问题是程序运行在X86架构的PC服务器上,发送端用C实现,接收端用JAVA实现。而发送端在发送数据之前,并没有从主机字节序转换到网络字节序,这样接收端接收到的就是小端数据,数据解释自然是错误的。
具体数据如下。实际发送的数据是23578
发送方发送数据:1A 5C
exmoda提示:接收方收到数据后,会按照BIG-ENDIAN进行解释。具体数据是什么?自己算算对比!

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 网络应用时的字节序问题

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情