首页 > 代码库 > 大端和小端
大端和小端
一、首先需要明白一点,术语“大端”和“小端”表示多个字节的哪一端(大端或小端)存储在该值的起始地址;
小端:将低序字节存储在起始地址;大端:将高序字节存储在起始地址;
对于一个16位的整数,内存中的存储方式如下图所示:
但遗憾的是,二者并没有标准可循,两种格式都有系统在使用,下面程序可以判断主机字节序:
1 int main(int argc, char **argv) 2 { 3 union { 4 short s; 5 char c[sizeof(short)]; 6 } un; 7 8 un.s = 0x0102; 9 printf("%s: ", CPU_VENDOR_OS);10 if (sizeof(short) == 2) {11 if (un.c[0] == 1 && un.c[1] == 2)12 printf("big-endian\n");13 else if (un.c[0] == 2 && un.c[1] == 1)14 printf("little-endian\n");15 else16 printf("unknown\n");17 } else18 printf("sizeof(short) = %d\n", sizeof(short));19 20 exit(0);21 }
通过巧妙使用共用体的特性,此程序可以检测出主机字节序;
二、把话题转到网络应用中,网络协议必须要指定一个网络字节序,因为16位的端口号和32位的IPv4地址在网络传输中都要使顺序达成一致;
因历史原因,网际协议使用大端字节序来传送多字节整数;
关于主机字节序和网络字节序的转换,会用到以下四个函数:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。