网站策划方案如何做,网站免费正能量推荐,怎样为网站设计关键词,黑龙江省建设厅网站站长大端及小端的简析 序言环境概念理解可能有问题的地方一般情况下需要注意的大小端情况关于大小端相关的实用函数/代码判断自身大小端的代码大小端转换函数 序言
我记得我已经查过4次了#xff0c;最近回想一下发现我竟然又忘了#xff01;所以特以此文来记录一下。
环境
Qt… 大端及小端的简析 序言环境概念理解可能有问题的地方一般情况下需要注意的大小端情况关于大小端相关的实用函数/代码判断自身大小端的代码大小端转换函数 序言
我记得我已经查过4次了最近回想一下发现我竟然又忘了所以特以此文来记录一下。
环境
Qt5.14.2 MSVC2017 64bit(VS2019)
概念
在计算机系统中计算机存储单元是字节“byte”在内存中存储的顺序就成了绕不开的问题也就出现了大端模式和小端模式为什么会有这两种模式呢
大端模式是更符合人理解的模式且符号位在所表示数据内存的第一个字节中便于快速判断数据的正负和大小。 小端模式是更符合机器性能的模式CPU做数值运算时从内存中按顺序依次从低位到高位取数据进行运算直到最后刷新最高位的符号位这样的运算方式会更高效内存的低地址处存放低字节所以在强制转换数据时不需要调整字节的内容。
大端模式Big-endian高位字节存低位地址低位字节存高位地址
小端模式Little-endian低位字节存低位地址高位字节存高位地址举个例子 数值 0x12345678 存的内存位置0x000000D3B8EFF254 ~ 0x000000D3B8EFF257 大端在内存中分别存的12 34 56 78 小端在内存中分别存的78 56 34 12
0x12 34 56 78其高位字节就是越左越高低位字节就是越右越低 0x000000D3B8EFF254 ~ 0x000000D3B8EFF257其高位地址就是数值越高就高其低位地址就是数值越低就低
在0x000000D3B8EFF254低位地址里存储0x12的则是大端模式存储0x78的则是小端模式。
理解可能有问题的地方
0x12 34 56 78共4个字节每个字节大端和小端存的都是一样的这个没什么区别意思是0x78的十六进制同样都是以0b0111 1000二进制的存放方法不会说大端模式就0001 1110这样存的不是这个意思大小端区别是按字节为单位判断的。有些人可能理解了十六进制0x12345678为例子时的大小端情况就不清楚十进制ulongchar数组std::string等非十六进制情况时大小端情况如果有这种疑惑说明你对数据的本质不清楚这些在内存中存放的实质上就是一个个组合成的二进制数或者是十六进制数字母可以用ASCII对照转换成十六进制数中文字符可以用Unicode来对照转换成十六进制数。
一般情况下需要注意的大小端情况
TCP/IP协议规定必须采用网络字节顺序NBONetwork Byte Order即大端模式。 而主机字节顺序HBOHost Byte Order则看所在的CPU处理器及编译器才能确定而不是看操作系统。
但是普遍常见的CPU是小端模式。
关于大小端相关的实用函数/代码
判断自身大小端的代码
union myunion
{int a;char b;
};// 如果是小端模式则返回1大端模式则返回0
bool is_little_endian(void)
{union myunion u1;u1.a 0x12345678; // 地址0的那个字节内是0x78小端或者0x12大端if(0x78 u1.b)return true;else if(0x12 u1.b)return false;
}大小端转换函数
头文件
windows #include WinSock2.h
linux: #include arpa/inet.h1htonl-》Host to Network Long函数原型uint32_t htonl (uint32_t hostlong)
函数返回值是一个32位的网络字节顺序。
函数的作用是将一个32位数从 主机字节顺序 转换成 网络字节顺序。注无符号的长整型 在 32位的系统是 4字节。2htons函数原型uint16_t htons (uint16_t hostshort)
函数返回值是一个16位的网络字节顺序。
函数的作用是将一个16位数从 主机字节顺序 转换成 网络字节顺序。注无符号的短整型 在 32位的系统是 2字节。3ntohl Network to Host Long函数原型是uint32_t ntohs (uint32_t netlong)
函数返回值是一个32位的主机字节顺序。
函数的作用是将一个32位数由 网络字节顺序 转换为 主机字节顺序。4ntohs 函数原型是uint16_t ntohs (uint16_t netshort)
函数返回值是一个16位的主机字节顺序。
函数的作用是将一个16位数由 网络字节顺序 转换为 主机字节顺序。等...因个人尚未读到这些函数的源码所以只清楚上述的函数中是知道主机字节顺序是小端的不确定自身CPU如果是大端模式会不会自行判断。