c语言主机字节序和网络字节序
一、什么是字节序
字节序是指多字节数据在计算机内存中存储顺序,或者网络传输时各字节的传输顺序,字节序分为大端序和小端序。
- 大端序:高字节存储在低位地址,传输数据时高位在前;
- 小端序:低字节存储在低位地址,传输数据时高位在后;
假设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语言主机字节序和网络字节序相关推荐
- linux网络编程一:主机字节序与网络字节序的的判断
linux网络编程一:主机字节序与网络字节序的的判断(1)现代CPU的累加器一次能装载至少4字节(32位),即一个整数.那么这4字节在内存中排列的顺序将影响它被累加器装载成的整数值,这就是字节序问题 ...
- 主机字节序与网络字节序的转换函数:htonl、ntohl、htons、ntohs
Part 1: htons函数具体解释 在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序. 在Intel机器下,执行以下程序 i ...
- 【Linux】主机字节序和网络字节序
(一)问题提出:为什么要有主机字节序和网络字节序的存在? 现在大多数PC机器都是小端字节序(小端存储),也称为主机字节序:但不排除有大端PC机器的存在. 若在两台字节序不同的主机上传输数据时,接收端将 ...
- 主机字节序与网络字节序的转换函数:htonl、ntohl、htons、ntohs【转】
(转自:https://blog.csdn.net/kulala082/article/details/53431473) Part 1: htons函数具体解释 在Linux和Windows网络编程 ...
- 字节序 主机字节序与网络字节序互相转换
目录 1.什么是字节序? 2.字节序分类 3.为什么要有大端字节序和小端字节序? 4.主机字节序和网络字节序 5.主机字节序与网络字节序的转换 6.怎么判断自己的主机是小端字节序还是大端字节序呢? 7 ...
- 主机字节序和网络字节序
1.大端字节序和小端字节序: 大端字节序存储时值的高位存储在较小的地址,值的低位存储在较大的地址. 小端字节序存储时值的高位存储在较大的地址,值的低位存储在较小的地址. 以0x12345678为例: ...
- Linux---主机字节序与网络字节序
现在的CPU累加器一次能够装载至少4个字节的一个整数,那么字节在内存中的排列顺序不同,导致累加器使用的结果不同,这就是字节序问题 . 例如: 我们存储一个int类型的数字:int a = 1; 主机字 ...
- 什么是字节序(端序、低端字节序、高端字节序、网络字节序)
前言 一个内容为12(字符串)的文本文件,它的第一个字节是什么(小端序)?如果你的回答是0x32,那你真的应该好好理解下字节序了.如下图所示,我这里的正确答案是0x31.当然如果你的回答是不一定,这似 ...
- 本地字节序和网络字节序
本地字节序和网络字节序 字节序指不同的CPU访问内存中多字节数据的时候,存在大小端的问题,并且一定是访问多字节数据的时候才会存在大小端的问题,如果CPU访问的是字符串,则不存在大小端的问题: 那么如何 ...
- 本地字节序与网络字节序的相互转换(IP地址、端口号)
一般数据在内存中是按照字节存储的,存储的方式分为大端和小端.在不知道对方主机的存储方式的情况下,我们不知道是否需要转换数据的存储方式.因此,TCP/IP协议规定:发送到网络的数据流应采用大端字节序! ...
最新文章
- 数据通信技术(九:OSPF特殊区域配置(Cisco))
- Hibernate 连接池的三种配置方式
- css 首字下沉 错位,css+div错位问题的修复小结
- opencv在python环境下的安装_python环境下安装opencv库的方法
- 解决java compiler level does not match the version of the inst
- python3 logging模块_python3中使用logging模块写日志,中文乱码,如何解决?
- qjsonarray 合并_QJsonObject和QJsonArray的巨坑
- Mac 屏幕可不可以用酒精清洁?正确清洁 Mac 的方法
- 拼多多总显示服务器冻僵,为什么拼多多商家后台会打不开?什么原因导致的?
- vue展示日历 考勤展示_Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示...
- 网络打印机怎么扫描到计算机,怎么用打印机扫描文件-富士施乐SC2020复印机设置网络扫描到计算机(SMB)...
- HDR关键技术:色度学,颜色空间及转换
- Linux下PHP下载安装
- 关于图计算图学习的基础知识概览:前置知识点学习(PGL)[系列一]
- Oracle Forensics t00ls
- 10.敏捷估计与规划——Financial Prioritization笔记
- 小心计算机视觉综合征!快来get护眼大法……
- 【JS】学习记录【页面打印】
- Windows 定时启动 关闭软件
- 【Elasticsearch】Elasticsearch 相关书籍
热门文章
- 洞察 | 软件定义汽车时代下,汽车制造产业的应对策略
- 抖音运营规则讲解系列(3):色情低俗内容具体划分丨国仁网络
- 基于Core Animation的KTV歌词视图的平滑实现
- html怎么防止表单重复提交表单,8.10 防止表单重复提交
- 【Unity】Unity协程(Coroutine)的原理与应用
- 数学建模 02多属性决策 归一化处理
- 8259的IRR、ISR、IMR的功能
- co01设置错误消息_win10提示“调制解调器报告了一个错误”怎么办
- Mysql还原数据库
- QQ推出QID名片功能:赶紧抢注靓号ID