一. 故事背景
1.最近在学习网络知识,自然免不了端序问题的探索;
2.在数据组织的过程中,遇到了端序问题的困扰;
3.具体问题是在,最开始我只是想单纯测试我计算机当前的端序。
二.故事开始
对于端序测试,其实就是看数据在内存中的存储方式,这句话比较笼统,大概是这个意思:
大端模式:数据的高位存储在内存的低字节。ARM/PowerPC等处理器采用大端模式
小端模式:数据的低位存储在内存的低字节。Intel架构处理器采用小端模式。
以下是我当时做的一些笔记:
是的,网络采用的是大端字节序
而不必担心,主机字节序与网络字节序的相互转换,系统是有提供相应函数的:
h代表host;n代表net
#include<netinet/in.h>
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);
而为什么会有端序的区分呢?
首先,大小端序是由CPU决定的(网络字节序是固定的哦)
其次,谁好谁坏是没有确切定论的,这是最早设计者们的选择,一篇知乎的文章挺有意思,大概解释了端序问题:https://www.zhihu.com/question/275738523/answer/382407340
三.故事继续
搞清楚概念,开始实践了----测测我的window下的端序,Linux下的端序。
是的,这是个很简单的基础,一个联合数据类型,或者一个int转char就可以搞定了。
(惭愧地报告一番,我竟然在联合数据类型上栽了个跟头,唉…)
那我们来浅谈一番Union
而我栽就栽在我忘了union的成员都是相对于其union的内存分配的基地址(首地址)开始计算的,所以我一开始测,总发现和结论是反的(再次手动捂脸)。
所以,最终上一个简单的端序测试代码
#include <stdio.h>
int main()
{
union
{
int nNum;
char cNum;
}unionChk;
unionChk.nNum = 1;
if(unionChk.cNum == 1)
{
printf("Little Endian\n");
}
else if(unionChk.cNum == 0)
{
printf("Big Endian\n");
}
printf("========== Check it Again ========== \n");
int nBuf = 0x11223344;
if((char)nBuf == 0x11)
{
printf("Big Endian\n");
}
else if((char)nBuf == 0x44)
{
printf("Little Endian\n");
}
}
四.故事结束
好啦,端序概念是很基础的知识,总结至此,还有很多基础知识需要夯实,持续进步,保持学习技术的初心。
推荐一本经典书籍:
《UNIX编程艺术》,读得懂,但并不代表能理解,真所谓此中有深意…
不足望指正,互相交流,共同进步