一、在进行网络通信时是否需要进行字节序转换?

相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。
原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节。小端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低字节),接收方网络协议函数接收时会将接收到的第一个字节存放到低地址(想要接收高字节,真正接收的是低字节),所以最后双方都正确的收发了数据。而相同平台进行通信时,如果双方都进行转换最后虽然能够正确收发数据,但是所做的转换是没有意义的,造成资源的浪费。而不同平台进行通信时必须进行转换,不转换会造成错误的收发数据,字节序转换函数会根据当前平台的存储模式做出相应正确的转换,如果当前平台是大端,则直接返回不进行转换,如果当前平台是小端,会将接收到得网络字节序进行转换。

二、大端和小端

"大端"和"小端"表示多字节值的哪一端存储在该值的起始地址处;小端存储在起始地址处,即是小端字节序;大端存储在起始地址处,即是大端字节序; 或者说: 1.小端法(Little-Endian)就是低位字节排放在内存的低地址端(即该值的起始地址),高位字节排放在内存的高地址端; 2.大端法(Big-Endian)就是高位字节排放在内存的低地址端(即该值的起始地址),低位字节排放在内存的高地址端; 举个简单的例子,对于整型数据0x12345678,它在大端法和小端法的系统中,各自的存放方式如下图1所示:

三、网络字节序

网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题; UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的; 所以说,网络字节序是大端字节序; 比如,我们经过网络发送整型数值0x12345678时,在80X86平台中,它是以小端发存放的,在发送之前需要使用系统提供的字节序转换函数htonl()将其转换成大端法存放的数值;如下图2所示:

 

网络通信之 字节序转换原理与网络字节序、大端和小端模式相关推荐

  1. 网络通信时字节序转换原理与网络字节序、大端和小端模式 .

    引言:在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换.原因如下:网络协议规定接收到得第一个字节是高字节, ...

  2. 大端和小端传输字节序

    大端和小端 在计算机中是以字节为单位,每一个地址对应一个字节,一个字节8bit.在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定, ...

  3. 大端模式小端模式 主机序网络序

    1. 主机序 不同的CPU有不同的字节序类型这些字节序是指整数在内存中保存的顺序,这个叫做主机序.最常见的有两种: 1.         Little endian:将低序字节存储在起始地址. 即小端 ...

  4. 大端模式小端模式、主机序网络序、入栈地址高低问题

    一.大端模式&小端模式 所谓的"大端模式",是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把 ...

  5. 大端模式、小端模式、高字节序、低字节序、MSB、LSB

    摘要:你知道内存是怎么读取数据的吗?知道数据是怎么一个一个字节发送的吗?是低字节先发还是高字节先发?是bit0先发还是bit7先发?是从低地址开始读还是从高地址开始读?看完本篇比应该就明白了~ 内存的 ...

  6. 字节顺序:大端模式 和 小端模式

    字节顺序有"大端模式" 和 "小端模式" 两种. 一.字节顺序只是对内置数据类型而言. 例如对于一整型(int,int 是内置数据类型)数,比如 0x12345 ...

  7. 【Linux网络编程】大端模式和小端模式

    00. 目录 文章目录 00. 目录 01. 概述 02. 示例分析 03. 优缺点 04. 数组存储 05. 测试机器模式 07. 附录 01. 概述 大端模式(Big-endian):高位字节排放 ...

  8. 网络传输大端序_大端、小端与网络字节序

    大端(Big-Endian),小端(Little-Endian)以及网络字节序的概念在编程中经常会遇到.网络字节序(Network Byte Order)一般是指大端(Big-Endian,对大部分网 ...

  9. linux网络编程之网络字节序、主机字节序、大端、小端

    1.主机字节序介绍 不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机字节序,存储方式有2种 1).大端模式 大端模式(Big-Endian)就是高位字节排放在内存的低 ...

最新文章

  1. 分布式事物解决方案-TCC
  2. openmp 互斥锁 mysql_openMP 函数总结(并行程序设计导论)
  3. Win11蓝屏100%不重启解决方法
  4. 通过demo搞懂encode_utf8和decode_utf8
  5. 易驾佳智能机器人教练_我市首个“机器人教练”上岗 驾校开启人工智能教学新模式...
  6. MySQL crash-safe replication
  7. CentOS更改yum源
  8. 超全opencv常见图像处理操作总结及效果展示(附python代码)
  9. C语言单片机把2000H清零,清零程序实验报告.doc
  10. 芯片设计流程介绍(从硬件设计语言到芯片制造)
  11. tpshop index.php,第三讲、TPshop linux安装
  12. 《启示录:打造用户喜爱的产品》第一部分 人员5 产品管理与软件开发
  13. webshell一句话
  14. 如何用CSS实现角标
  15. 行缓冲,全缓冲,无缓冲的详细介绍
  16. 数据保护新愿景:欧盟GDPR十个误解与争议
  17. Qt源码分析之信号和槽机制
  18. java集合入门和深入学习
  19. Python 简易版小工具 | 计算天数
  20. 自己总结的html+css试题

热门文章

  1. 运用@media实现网页自适应中的几个关键分辨率
  2. UITableViewCell自定义高度
  3. TCPIP,Http,Socket的区别
  4. windows XP cmd命令集
  5. apache代理时java获取IP的问题
  6. 编写完html文件怎么输出,怎么编写一个html文件?在线等!!
  7. [十问] 软件基础知识
  8. azkaban修改MySQL配置上传包的大小上限
  9. k8s 使用helm部署dashboard
  10. Scala伴生类与伴生对象:apply方法/伴生对象可以访问伴生类的私有属性