网络字节序

Posted 一名程序员的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络字节序相关的知识,希望对你有一定的参考价值。

一、概念:

  大端模式(Big-endian):是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

  小端模式(Little-endian):是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

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

举例:

  整形值10000,对应十六进制表示为0x2710,按照字节可分为0x27(高位)和0x10(低位)
小端字节序:第一个内存单元就是低地址,存放低位:0x10,接下来的内存单元是高地址,存放高位:0x27   --->0x1027
大端字节序:第一个内存单元就是低地址,存放高位:0x27,接下来的内存单元是低地址,存放低位:0x10 --->0x2710
  数组是连续分配内存的,每个数组单元的存放空间是由数组类型决定,但是数组单元间的前后顺序是固定了的。那么在网络传输后,数组各单元的先后顺序不会改变,至于数组单元的值,如果数组类型不止占1个字节的话,就会发生改变。而字符串是字符数组,字符是占1个字节,所以接收端没有进行大小端转换的话也不会影响最终的字符串值。
  网络传输的时候,要按照大端字节序传输,其实是为了避免发送数据端和接收数据端的机器两边本地的字节序不一致导致接收数据不一致。如果哪边是字节序和网络字节序是一致的,那么就可以不用大小端转换,反之,不一致就要执行大小端转换

 

二、转换

2.1、小头转大头:System.Net.IPAddress.HostToNetworkOrder(value)//NET是小头结构,网络字节是大头结构,需要客户端和服务器约定好

2.2、大头转小头:

以上是关于网络字节序的主要内容,如果未能解决你的问题,请参考以下文章

网络字节序

网络字节序

c++接收数据的时候,需要把网络字节序转成主机字节序吗

主机序与网络字节序解析

主机字节序和网络字节序转换

第五篇:主机字节序与网络字节序的转换