字节顺序
来源:互联网 发布:黑暗之光境界升阶数据 编辑:程序博客网 时间:2024/04/29 22:30
计算机内存是如何存储一个多于一个字节的类型的数据呢,假如有1234H这个数一般有如下两种方式1 0x12 0x34 2.0x34 0x12
这种多字节数据类型的存储顺序即称为字节顺序。第一种是高字节在前,这种存储顺序称为大端(big-endian),第二种是低字节在前,这种存储顺序称为小端(little-endian)。Intel的x86系列CPU采用低字节顺序,而有些CPU 如:SUN SPARC以及网络传输协议TCP/IP采用的高字节顺序。我们大部分都在用Intel的x86系列的微机,如果要进行网络编程,就要在不同的字节顺序间传输数据,这样就会收到错误的数据。(如何解决这个问题呢?)有两种方法:一种是全部转换成文本来传输;另一种就是要在不同的字节顺序之间进行转换。
Socket编程中经常采用第二个方法。Winsock编程中整个的传输过程如下:接受到网络的数据后先转换成本机顺序(调用API函数ntohs和ntohl),然后继其他操作;发送数据时先把本机字节顺序的数据转换成网络字节顺序(调用API函数htons和htonl),然后发送。这样就可以确保数据正确的传输了。
这四个API中n代表network(网络),h代表host(本地主机的意思),s代表16位u_short类型,l代表32为u_long类型。知道了这几个字母的意思,理解这四个函数的作用就不难了。
但是,如何知道本机所采用的字节顺序呢,可以将一个多字节的数据转换成单字节类型(byte),这样就会只得到存储在最前面的那个字节。查看这个字节里的值就可以知道本机所采用的字节顺序了。或者可以采用如下代码:
#include <iostream>
using namespace std;
int CheckEndian()
{
union
{
int iFourBytes;
char cOneByte;
} uEndianChecker;
uEndianChecker.iFourBytes = 1 ;
return uEndianChecker.cOneByte;
}
int main()
{
if(CheckEndian()==1)
cout<<"little-endian";
return 0;
}
注:这段代码来源于某位网友,感谢这位不知名的网友。
- 字节顺序
- 字节顺序
- 字节顺序
- 字节顺序
- 字节顺序
- 字节顺序
- 字节顺序
- 字节顺序
- 字节顺序
- 字节顺序
- 字节顺序
- 字节顺序
- 字节顺序
- 字节顺序
- 字节顺序
- 字节顺序
- 字节顺序 & 网络字节顺序
- 字节顺序&字节对齐
- ant编译脚本
- 使用java的xfire调用.net的webservice-王亮
- 外贸网站做外链途径
- HDU 3069 Arrest
- vc++ 6.0 安装出现的问题
- 字节顺序
- 干掉360
- 我的摘抄的东西哦。
- Java可变参数方法重载时要注意的几个问题
- 晕……
- hibernate之控制并发访问(ANSI事务隔离性级别)
- HDU 3070 有度限制的生成树的个数
- HDU 3072 Intelligence System 强连通 最小树形图
- (转) ThreadLocal-分析-总结