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

原创 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个字节,所以接收端没有进行大小端转换的话也不会影响最终的字符串值。


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

网络字节序和主机字节序详解!!!

我们都知道,如今的通讯方式已经趋向与多样化,异构通信(计算机软件(操作系统) +    计算机硬件(内核架构,ARM,x86)不同)也已经很普遍了,如,手机和电脑中的qq进行通信,,, 同时,在计...
  • msdnwolaile
  • msdnwolaile
  • 2016年02月24日 09:52
  • 6977

主机字节序与网络字节序的转换过程

主机字节序与网络字节序的转换过程
  • an_tang
  • an_tang
  • 2017年05月29日 17:13
  • 1051

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

接下来介绍两组地址转换函数,
  • a1152024140
  • a1152024140
  • 2014年10月05日 18:17
  • 1497

网络字节序与主机字节序

一.什么是Big Endian和Little Endian? 1.故事的起源 “endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(...
  • App_IOS
  • App_IOS
  • 2017年02月07日 11:27
  • 321

网络字节序与主机字节序的转换

在对IP地址结构体SOCKADDR_IN赋值的时候,经常会用到下列的函数htonl,htons,inet_addr,与之相对应的函数是ntohl,ntohs,inet_ntoa。查看这些函数的解析,会...
  • u012317833
  • u012317833
  • 2014年09月20日 08:50
  • 1582

主机字节序(大小端判断)及网络字节序

如有转载,请注明出处。 作者:super_bert@csdn 先上两种判断主机字节序的方法(C描述),再详细解释。 判断原理: 1.Union成员本身是被存放在相同的内存空间中(即共享内存),uni...
  • qq302501035
  • qq302501035
  • 2015年04月20日 15:55
  • 1403

Java字节序(不同语言中的网络数据传输时字节序列转换)

/** * 通信格式转换 * * Java和一些windows编程语言如c、c++、delphi所写的网络程序进行通讯时,需要进行相应的转换 * 高、低字节之间的转换 * windows的字节序为低字...
  • ycb1689
  • ycb1689
  • 2013年11月19日 10:26
  • 2165

php主机字节序和网络字节序

使用php编写socket程序时,也需要注意主机字节序和网络字节序的转换 主机字节序就是我们平常说的大端和小端模式:不同的 CPU 有不同的字节序类型,这些字节序是指整数在内存中保存的顺序 这个叫做...
  • sole_cc
  • sole_cc
  • 2016年07月24日 22:01
  • 1072

网络字节序和本地字节序

1.字节序定义:是指整数在内存中保存的顺序。2.字节序种类:a.Little endinan 低位存储在内存的低地址,高位存储在内存的高地址;b.Big endian 高位存储在内存的低地址,低位存储...
  • u012627927
  • u012627927
  • 2015年06月11日 15:17
  • 1167

测试平台大端还是小端(网络字节序和主机字节序)

大端和小端(网络字节序和主机字节序): 大端(Big Endian):即网络字节序。 小端(Littile Endian):即主机字节序。 记忆方式:网络的范围很大,所以大端是网络字节序。 大...
  • feifeiwuxian
  • feifeiwuxian
  • 2015年12月29日 15:37
  • 1019
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么主机或网络字节序对字符串不影响结果
举报原因:
原因补充:

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