本文分类:
软件理论与软件工程

字节序分为网络字节序和主机字节序,通常只有在跨平台应用及网络传输中才考虑字节序。

主机字节序是保存和读取多于一个字节的数据时,其每个字节在内存中的存放顺序,主机字节序和CPU有关。网络字节序是网络上传输多于一个字节的数据时先传输哪个字节。无论是主机字节序还是网络字节序,都分为两类:大端字节序(Big-Endian)和小端字节序(Little-Endian)。

对于主机字节序,大端字节序就是高位字节排放在内存的低地址端,即该值的起始地址,低位字节排放在内存的高地址端。小端字节序就是低位字节排放在内存的低地址端,即该值的起始地址,高位字节排放在内存的高地址端。常见的CPU,x86是小端字节序,PowerPC是大端字节序,Java虚拟机是大端字节序,ARM同时支持两种字节序,需要在启动时设置其中之一。

对于网络字节序,大端字节序就是传输时先传输高位字节,小端字节序就是传输时先传输低位字节。TCP/IP协议使用大端字节序,即发送和接收的第一个字节是高位字节。

下面以一个C语言程序判断主机字节序和展示字节存放顺序:

#include <stdio.h>
int main()
{
    printf("%d\n", isBigEndian1());
    printf("%d\n", isBigEndian2());
    check();
}
int isBigEndian1()
{
    int a = 0x12345678;
    char *p = (char *)&a;
    return *p == 0x12;
}
int isBigEndian2()
{
    union
    {
        int a;
        char b;
    } c;
    c.a = 0x12345678;
    return c.b == 0x12;
}
int check()
{
    int a = 0x12345678;
    char *p = (char *) &a;
    printf("%x %x\n", &a, a);
    int i = 0;
    for (i = 0; i < 4; i++) {
        printf("%x %x\n", p, *p);
        p++;
    }
}

执行结果

地址 大端 小端
5f76d1b0 12345678 12345678
5f76d1b0 78 12
5f76d1b1 56 34
5f76d1b2 34 56
5f76d1b3 12 78
本文来自 [时光记 - 王智超的个人空间](www.hiwzc.com),转载请注明出处。