字节序
前言
为什么会出现大端字节序和小端字节序呢?统一使用一种字节序不是更好吗?
介绍
大端字节序 : 高位字节在低地址,低位字节在高地址
小端字节序: 高位字节在高地址,低位字节在低地址
0x1234567
的大端字节序和小端字节学的写法如下图所示:
原因
计算机电路在处理低位字节时,效率比较高,因为计算机都是从低位开始的,所以,计算机的内部处理都是小端字节序;
但是在程序员的眼里,还是习惯读写大端字节序,所以除了计算机内部外,其他场合大都使用大端字节序;如网络传输和文件存储中;
判断字节序
以下已 c++ 为例,判断是否为大端字节序
static bool IsBigEndian()
{
const unsigned short n = 0x0001;
//取最后一个字节,判断是否为 1, 如果是,则说明低地址在低位,则为小端字节序
if(*(char *)&n)
{
return false;
}
return true;
}
字节序转换
以下是字节序转换的函数,通过位移运算符的方式转换。
//16 位字节序转换
static uint16 Swap16(uint16 s)
{
return (s & 0xff) << 8 | (s >> 8) & 0xff;
}
//32 位字节序转换
static uint32 Swap32(uint32 l)
{
return l >> 24 |
(l & 0x00ff0000) >> 8 |
(l & 0x0000ff00) << 8 |
l << 24;
}
//64 位字节序转换
static uint64 Swap64(uint64 ll)
{
return ll >> 56|
(ll & 0x00ff000000000000) >> 40 |
(ll & 0x0000ff0000000000) >> 24 |
(ll & 0x000000ff00000000) >> 8 |
(ll & 0x00000000ff000000) << 8 |
(ll & 0x0000000000ff0000) << 24 |
(ll & 0x000000000000ff00) << 40 |
ll << 56;
}