为什么主机或网络字节序对字符串不影响结果

原创 2015年07月10日 11:52:26

当进行网络传输时,都要求按照网络字节序进行传输。当接收到结果后,如果我们系统使用的字节序不是网络字节序,那么如果不对整形的结果进行大小端转换,结果就会错误,疑问,为什么字符串的值不受影响??

基础知识

a) 小端字节序:Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) 大端字节序:Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

网络字节序被规定为大端字节序。

主机字节序往往和系统有关,有大端字节序和小端字节序


思考:

小端字节序和大端字节序中,区别在于地地址存低位还是高位的区别,字节序中的低位和高位仅针对大于1个字节的组合内存空间(自己定义的名词,就是值的大小是要多个内存单元组合而成,比如int是4个字节(32位或64位上),那么int类型的值就要4个内存单元组合得到)。内存的单位是字节,对于字符来说,char是1个字节,不受主机字节序和网络字节序的影响,在内存中就一个单元,没有前后之分。但是当是组合内存空间时,因为有多个内存单元,就有前后之分,而小端和大端字节序的差别就在于怎么对这个前后内存单元进行组合。小端字节序中,是在第一个内存单元中存放低位(即低地址),接下来的内存单元依次存放高位。而在大端字节序中,是在第一个内存单元中存放高位(即低地址),接下来的内存单元依次存放低位。

举例:整形值10000,对应十六进制表示为0x2710,按照字节可分为0x27(高位)和0x10(低位)

小端字节序:第一个内存单元就是低地址,存放低位:0x10,接下来的内存单元是高地址,存放高位:0x27   --->0x1027

大端字节序:第一个内存单元就是低地址,存放高位:0x27,接下来的内存单元是低地址,存放低位:0x10 --->0x2710


那么,我们假设网络传输10000这个值,因为是通过字节传输,所以网络传输的值是10 27 00 00。


如果发送端和接收端的字节序一致,那么网络传输的时候,可不进行大小端转换,一样能获得相同的值。


下面的结果是建立在一个前提之上:网络传输的字节序和主机字节序不同。

结果:

既然知道了这个差别,那么我们知道,数组是连续分配内存的,每个数组单元的存放空间是由数组类型决定,但是数组单元间的前后顺序是固定了的。那么在网络传输后,数组各单元的先后顺序不会改变,至于数组单元的值,如果数组类型不止占1个字节的话,就会发生改变。而字符串是字符数组,字符是占1个字节,所以接收端没有进行大小端转换的话也不会影响最终的字符串值。


至于为什么规定网络传输的时候,要按照大端字节序传输,其实是为了避免发送数据端和接收数据端的机器两边本地的字节序不一致导致接收数据不一致。如果哪边是字节序和网络字节序是一致的,那么就可以不用大小端转换,反之,不一致就要执行大小端转换

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

网络传输过程过 大小端问题 注意字符串是不需要的

网络传输数据要不要转换大小端字节序的问题? (2009-1-4 21:29)我看到书上讲网络时都是说:Internet上的数据以大端方式在网络上传输,所以对于内部是小端方式储存数据的机器,在inter...

再议字节序-------TCP/IP网络传输相关字节序

对于网络这一块的字节序,说实话,理解不够深,在网上学些了下,先整理点,以后继续完善。 实际上如果是应用层的数据,即对TCP/IP来说是透明的数据,不用考虑字节序的问题。因为接收端收到的顺序是和发送...

网络字节序之间的转换函数详解

接下来介绍两组地址转换函数,

OC中把字符串倒叙,且每个单词正序, 并计算单词数,两个单词间空格多少不影响结果

1 OC中把字符串倒叙,且每个单词正序, 并计算单词数,代码如下 .m @interface ViewController () @property (nonatomic , strong )NSS...

网络编程(7)字节序对跨平台数据传输的影响

关于字节序对跨平台数据传输的作用。我分下面几个方面整理了下,知识点应当算比较全了。 一。从服务端发送整数到客户端为例,看看字节序的应用。 二。什么是字节序? 三。什么是网络字节序 四。如何确定本机的...

主机和网络字节序总结

字节序是指数据的保存顺序  最常见的有两种: 1. Little endian:将低序字节存储在起始地址 2. Big endian:将高序字节存储在起始地址 LE little-...

大端 小端 主机 网络 字节序

说实话这个东西困扰了我一段时间了,尤其是搀和进来网络字节序的时候,真是懵懂纠结啊。。。 缘起:        最初接触是从变量内存布局时知道的,大端小端还是蛮好理解的:大端(big endian)...

【C++】Winsock套接字编程,struct sockaddr、sockaddr_in,主机网络字节序

前一篇关于windows平台下winsock套接字编程的相关api struct sockaddr与struct sockaddr_in 在bind函数,connect函数里提到了套接字编...

WinSock网络编程学习(三)判断主机字节序程序

什么是“字节序”? 在计算机网络中,通信是基于信息流的,不管是有线通信还是无线通信,那么数据在通道上传输时,就需要考虑一个问题:数据在传输时,正确的字节顺序是怎样的?收到的时候又该以怎样的顺序去解读...

float字节序和主机序 网络序传输

float网络字节序转换及其逆转换  对于整形已经有了这几个函数htons() 、htonl()、ntohl()、ntohs() 对网络字节序进行转换,我这里给出两种对于float型的转换方法: 首先...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)