| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 数据在内存中存放的顺序之字节序(附图解、判断本机大小端程序及例题)【建议收藏食用】 -> 正文阅读 |
|
[大数据]数据在内存中存放的顺序之字节序(附图解、判断本机大小端程序及例题)【建议收藏食用】 |
引言📖
举一个栗子🌰:当你声明一个变量的时候,操作系统会给你分配一块空间,但是如果你创建的这个变量的类型是【short/int/float/double】这些大小大于一个字节的类型的数据,操作系统反正是已经把这些类型相应的大小的空间分配给你了,你内部怎么存储可不关它的事了,也就是我们将一个4字节的数据存入分配好的一段4字节的物理容器里, 该怎么存放呢?这时,我们存放进去的数据的字节是该依据一般人们的读写习惯从左往右依次写入, 还是从右向左写入呢? 不论哪种方式只要保证写入和读出的数据一致即可。 字节序📌之Little-Endian&Big-Endian对于字节序列的存储格式,必然需要说到CPU的两大派系,那就是IBM的Power PC系列的CPU和Intel的x86系列的CPU。Power PC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么big endian和little endian都是些什么鬼呢🧐? 在几乎所有的机器上,多字节对象都被存储为连续的字节序列,而字节序指的是多字节的数据各字节在内存中的存储顺序,分为大端存储模式(Big-Endian)和小端存储模式(Little-Endian)。
假设,一个4字节的int类型变量a,它的十六进制形式为0x11223344,( 显然,Big-Endian的存储更贴切于我们平时的读写习惯。那么为什么不统一使用Big-Endian呢?
这里需要注意?:只有读取的时候,才必须区分字节序,其他情况都不用考虑。
本地序和网络序📌
本地序(也称主机序):指处理器本身所采用的字节序,因此有的大端序,有的小端序。 网络序:指网络传输采用的字节序。网络序是标准化的,统一采用大端序。因此,发送网络数据之前需要将本地序转换为网络序。
计算机网络的出现让大小端问题变的复杂化了,每个计算机都有自己的主机字节序。不同计算机之间通过网络通信时:我“说”的你听不懂,你“说”我也听不懂,这可怎么办?这时候就需要约定俗成的协议来解决问题。 TCP/IP协议很好的解决了这个问题,TCP/IP协议规定使用“大端”字节序作为网络字节序。 这样不管计算机采用哪种字节序,发送数据的时候必须将自己的主机字节序转换为网络字节序,对接收到的数据转换为自己的主机字节序。这样一来,也就达到了与CPU、操作系统无关,实现了网络通信的标准化。 数据从本地传输到网络,需要转换为网络序,接收到的网络数据需要转换为本地序后使用。C提供了一组接口用于整型数据在本地序和网络序之间的转换。 通信时的本地序和网络序之间相互转换这种常用的操作在Socket API这一层,一般都提供了封装好的转换函数。从主机字节序到网络字节序的转换函数:htons、htonl(C语言),从网络字节序到主机字节序的转换函数:ntohs、ntohl(C语言)。当然,明白了原理后也可以编写自己的转换函数。 判断当前机器的大小端📌
思路:假设给上 大端: 小端: 可以看出,可以通过判断第一个字节的内容判断大小端,第一个字节为0则是大端,为1则是小端。 可是怎么取第一个字节呢?这里我们可以用指针的类型的解引用来控制访问内存的大小,
把这个功能封装成一个函数:
那么这个函数呢,是可以优化的:
仍可以更简洁:
总结:访问内存就需要考虑到指针。 大小端例题📌
假设a变量的地址为0x64,则a变量在内存中的模型为: char*类型的指针变量pc只能指向字符类型的空间,如果是非char类型的空间,必须要将该空间的地址强转为char*类型。 pc实际指向的是整形变量a的空间,即pc的内容为0x64,即44;*pc=0,即将44位置中内容改为0,修改完成之后,a中内容为:0x11223300 (全剧终)感谢食用! 注:参考文章(https://www.ruanyifeng.com/blog/2016/11/byte-order.html) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 20:01:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |