一、什么是字节序

字节序是指多字节数据在计算机内存中存储顺序,或者网络传输时各字节的传输顺序,字节序分为大端序和小端序。

  • 大端序:高字节存储在低位地址,传输数据时高位在前;
  • 小端序:低字节存储在低位地址,传输数据时高位在后;

假设0x4001-0x4004地址中存储有一个整型变量0x12345678,它在大端和小端mcu中的存储方式如下:

地址 大端存储 小端存储
0x4004 0x78 0x12
0x4003 0x56 0x34
0x4002 0x34 0x56
0x4001 0x12 0x78

地址0x4001是低位地址,0x12是数据的高位,高位数据0x12放在低位地址,则是大端序,反之则是小端序。

前面讲的都是多字节数据在计算机中存储的方式,我们在进行数据通讯的时候通常也会约定字节序。在数据通讯中,数据的高位先传输,则为大端序,数据的低位先传输,则为小端序。比如0x12345678这四个字节的数据,如果依次传输0x12、0x34、0x56、0x78则为大端序。

二、如何判断字节序

字节序的判断只需要一段简单的代码即可:

int main()
{int x=0x12345678; unsigned char *p=(char *)&x;  printf("%p %p %p %p\r\n",p,p+1,p+2,p+3);printf("%0x %0x %0x %0x\r\n",p[0],p[1],p[2],p[3]);
}

在ubuntu下的执行结果为:

从执行结果可以得到低字节的78存储在低地址0x7ffe4970678c,所以ubuntu的字节序是小端序。

linux下还可以使用shell查看字节序

lscpu | grep -i byte

lscpu表示查看cup的相关信息,grep -i byte表示过滤字节序字段。

三、网络字节序

TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,所以网络字节序是大端序; 我们的电脑和一些常用的处理器芯片大都是小端序的存储方式,在发送数据之前需要进行字节序的转换。

假设我们需要把0x12345678通过udp发送出去,我们在linux上写如下代码:

int buffer = 0x12345678;
ret = sendto(sockfd,&buffer,sizeof(int),0,&dest_addr,sizeof(dest_addr));

通过wireshark抓取得到的数据包为:

我们可以使用htonl将主机字节序转换成网络字节序:

int buffer = 0x12345678;
buffer = htonl(buffer);
ret = sendto(sockfd,&buffer,sizeof(int),0,&dest_addr,sizeof(dest_addr));

使用wireshark抓取得到的数据如下:

c语言主机字节序和网络字节序相关推荐

  1. linux网络编程一:主机字节序与网络字节序的的判断

     linux网络编程一:主机字节序与网络字节序的的判断(1)现代CPU的累加器一次能装载至少4字节(32位),即一个整数.那么这4字节在内存中排列的顺序将影响它被累加器装载成的整数值,这就是字节序问题 ...

  2. 主机字节序与网络字节序的转换函数:htonl、ntohl、htons、ntohs

    Part 1: htons函数具体解释      在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序. 在Intel机器下,执行以下程序 i ...

  3. 【Linux】主机字节序和网络字节序

    (一)问题提出:为什么要有主机字节序和网络字节序的存在? 现在大多数PC机器都是小端字节序(小端存储),也称为主机字节序:但不排除有大端PC机器的存在. 若在两台字节序不同的主机上传输数据时,接收端将 ...

  4. 主机字节序与网络字节序的转换函数:htonl、ntohl、htons、ntohs【转】

    (转自:https://blog.csdn.net/kulala082/article/details/53431473) Part 1: htons函数具体解释 在Linux和Windows网络编程 ...

  5. 字节序 主机字节序与网络字节序互相转换

    目录 1.什么是字节序? 2.字节序分类 3.为什么要有大端字节序和小端字节序? 4.主机字节序和网络字节序 5.主机字节序与网络字节序的转换 6.怎么判断自己的主机是小端字节序还是大端字节序呢? 7 ...

  6. 主机字节序和网络字节序

    1.大端字节序和小端字节序: 大端字节序存储时值的高位存储在较小的地址,值的低位存储在较大的地址. 小端字节序存储时值的高位存储在较大的地址,值的低位存储在较小的地址. 以0x12345678为例: ...

  7. Linux---主机字节序与网络字节序

    现在的CPU累加器一次能够装载至少4个字节的一个整数,那么字节在内存中的排列顺序不同,导致累加器使用的结果不同,这就是字节序问题 . 例如: 我们存储一个int类型的数字:int a = 1; 主机字 ...

  8. 什么是字节序(端序、低端字节序、高端字节序、网络字节序)

    前言 一个内容为12(字符串)的文本文件,它的第一个字节是什么(小端序)?如果你的回答是0x32,那你真的应该好好理解下字节序了.如下图所示,我这里的正确答案是0x31.当然如果你的回答是不一定,这似 ...

  9. 本地字节序和网络字节序

    本地字节序和网络字节序 字节序指不同的CPU访问内存中多字节数据的时候,存在大小端的问题,并且一定是访问多字节数据的时候才会存在大小端的问题,如果CPU访问的是字符串,则不存在大小端的问题: 那么如何 ...

  10. 本地字节序与网络字节序的相互转换(IP地址、端口号)

    一般数据在内存中是按照字节存储的,存储的方式分为大端和小端.在不知道对方主机的存储方式的情况下,我们不知道是否需要转换数据的存储方式.因此,TCP/IP协议规定:发送到网络的数据流应采用大端字节序! ...

最新文章

  1. 数据通信技术(九:OSPF特殊区域配置(Cisco))
  2. Hibernate 连接池的三种配置方式
  3. css 首字下沉 错位,css+div错位问题的修复小结
  4. opencv在python环境下的安装_python环境下安装opencv库的方法
  5. 解决java compiler level does not match the version of the inst
  6. python3 logging模块_python3中使用logging模块写日志,中文乱码,如何解决?
  7. qjsonarray 合并_QJsonObject和QJsonArray的巨坑
  8. Mac 屏幕可不可以用酒精清洁?正确清洁 Mac 的方法
  9. 拼多多总显示服务器冻僵,为什么拼多多商家后台会打不开?什么原因导致的?
  10. vue展示日历 考勤展示_Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示...
  11. 网络打印机怎么扫描到计算机,怎么用打印机扫描文件-富士施乐SC2020复印机设置网络扫描到计算机(SMB)...
  12. HDR关键技术:色度学,颜色空间及转换
  13. Linux下PHP下载安装
  14. 关于图计算图学习的基础知识概览:前置知识点学习(PGL)[系列一]
  15. Oracle Forensics t00ls
  16. 10.敏捷估计与规划——Financial Prioritization笔记
  17. 小心计算机视觉综合征!快来get护眼大法……
  18. 【JS】学习记录【页面打印】
  19. Windows 定时启动 关闭软件
  20. 【Elasticsearch】Elasticsearch 相关书籍

热门文章

  1. 洞察 | 软件定义汽车时代下,汽车制造产业的应对策略
  2. 抖音运营规则讲解系列(3):色情低俗内容具体划分丨国仁网络
  3. 基于Core Animation的KTV歌词视图的平滑实现
  4. html怎么防止表单重复提交表单,8.10 防止表单重复提交
  5. 【Unity】Unity协程(Coroutine)的原理与应用
  6. 数学建模 02多属性决策 归一化处理
  7. 8259的IRR、ISR、IMR的功能
  8. co01设置错误消息_win10提示“调制解调器报告了一个错误”怎么办
  9. Mysql还原数据库
  10. QQ推出QID名片功能:赶紧抢注靓号ID