1. #include <winsock.h>
u_long PASCAL FAR htonl( u_long hostlong);
u_long PASCAL FAR ntohl( u_long netlong);
htonl(),在传输前,将一个无符号长整形数从主机字节顺序转换为网络字节顺序。
ntohl(),在解析时,将一个无符号长整形数从网络字节顺序转换为主机字节顺序。
( n:network, h:host, l:long )
如果计算机本身的字节序与网络字节序相同,它们就代表空操作。
Symbian要包含的头文件是 #include <types.h> 和 #include <in.h>
2. 还有htons,ntohs它用来对short类型转换。单字节的变量不用转换。
3. 除了moto的68K系列和dec的sparc是big endian,常见的cpu都是little endian。ARM同时支持 big和little,实际应用中通常使用little endian。WINDOWS平台的处理器也是little endian的.但是一般情况在发送数据要把数据转换成网络字节序(big endian),接收方在接收数据再转换为本机字节序.如果确保设备都是同一种endian那么就可以在发送和接收时都不转换.否则还是按照标准做为好.
Symbian SDK中也提供了相关的支持,可以参考SDK » Developer Library » API Reference » C++ API reference » Sockets Client下面的BigEndian ,ByteOrder ,LittleEndian
4.http://zhangbaolin.blog.ccidnet.com/blog.php?do=showone&itemid=172264&typ=blog
5. java字节序
http://origin100.javaeye.com/blog/267165
http://www.blogjava.net/byterat/archive/2007/10/24/155471.html
6.
对于任何字符编码,编码单元的顺序是由编码方案指定的,与endian无关。编码单元之间的顺序是编码方案指定的,编码单元内部的字节排列才会受到endian的影响。 例如GBK用两个字节表示一个汉字,但是其编码单元是字节,所以这两个字节的顺序是固定的,不受CPU字节序的影响。UTF-16的编码单元是word(双字节)。
是否可以这样总结:int的编码单元是4字节,short编码单元2字节,unicode编码单元4字节。
7.
(1).高位字节,低位字节
一般一个16位(双字节)的数据,比如 FF1A (16进制),那么高位字节就是FF,低位字节是1A
如果是32位的数据,比如 3F68415B,高位字是3F68,低位字是415B
数字表达式的左边是高位 , 右边是低位位。
(2).高端内存,低端内存
数字表达式的左边是低端(小端),右边是高端(大端).可能低端内存地址值小,高端内存地址值大。
(3).BIG-ENDIAN、LITTLE-ENDIAN跟多字节类型的数据有关的比如int,short,long型,而对单字节数据byte却没有影响。
BIG-ENDIAN就是高位字节排放在内存的低端,低位字节排放在内存的高端.
LITTLE-ENDIAN正好相反,低位在低端,高位在高端.
即是按在内存地址从小到大顺序,高位字节记录在前面的是大BIG-ENDIAN,否则是LITTLE-ENDIAN。
比如 int a = 0x15263748,占4个字节.
在BIG-ENDIAN的情况下存放为: 15 26 37 48
在LITTLE-ENDIAN的情况下存放为:48 37 26 15
可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的
(4).JAVA编写的程序则唯一采用big endian方式来存储数据.
所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当
两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输
(5).写一个C函数,要求若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
实现:
int checkCPU()
{
{
union w
{
int a;
char b;
} c;
c.a = 1;
return (c.b == 1);
}
}
剖析:
嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 存放内容
0x4000 0x34
0x4001 0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 存放内容
0x4000 0x12
0x4001 0x34
32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为: 内存地址 存放内容
0x4000 0x78
0x4001 0x56
0x4002 0x34
0x4003 0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 存放内容
0x4000 0x12
0x4001 0x34
0x4002 0x56
0x4003 0x78
联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性,轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。如果c.b仍然等于1,则是低字节序;如果c.b不等于1,则cpu是高字节序了.