在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节序列中最小的地址。对表示一个对象的字节序列排序有两个规则:大端法和小端法。
最低有效字节在最前面的方式被称为小端法(little endian),大多数源自以前的Digital Equipment公司的机器,以及Intel的机器都采用这种规则;最高有效字节在最前面的方式被称为大端法(big endian),IBM、Motorola和Sun Microsystems的大多数机器都采用这种规则。
LE little-endian
最符合人的思维的字节序
地址低位存储值的低位
地址高位存储值的高位
怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说
低位值小,就应该放在内存地址小的地方,也即内存地址低位
反之,高位值就应该放在内存地址大的地方,也即内存地址高位
BE big-endian
最直观的字节序
地址低位存储值的高位
地址高位存储值的低位
为什么说直观,不要考虑对应关系
只需要把内存地址从左到右按照由低到高的顺序写出
把值按照通常的高位到低位的顺序写出
两者对照,一个字节一个字节的填充进去
一个例子,假设变量x的类型为int,位于地址0x0100处,有一个十六进制值为0x01234567。地址范围0x100~0x103的字节顺序依赖于机器的类型:
地址: 0x0100 0x0101 0x0102 0x0103
大端法: 01 23 45 67
小端法: 67 45 23 01
下面是一个测试机器是大端还是小端机器的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
union{
short s;
char c[sizeof(short)];
} un;
un.s = 0x0102;
if(sizeof(short) == 2)
{
if(un.c[0] == 1 && un.c[1] == 2)
printf("big endian\n");
else if(un.c[0] == 2 && un.c[1] == 1)
printf("little endian\n");
else
printf("unknown\n");
}
else
{
printf("sizeof(short): %d\n", sizeof(short));
}
system("pause");
return 0;
}
上面代码利用了union的特性(它的变量共用内存地址空间)。
分享到:
相关推荐
IP、主机字节序、网络字节序、互转 ------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using ...
利用宏将网络字节序和主机字节序ip格式化输出为字符串ip
对字节序的一些理解。
网络字节序与主机字节序
网络字节序 主机字节序
用C语言写的判断主机字节序的代码,一共有2种方法判断
字节序 大小端 网络编程 字节序 大小端 网络编程
在上一篇文章网络编程:主机字节序和网络字节序中,介绍了主机字节序和网络字节序的基本概念以及在实际的编程中,何时需要进行网络字节序和主机字节序的转换。本篇文章着重介绍使用c++和python语言,如何实现主机...
判断主机到底是大端还是小端的c程序!利用位置判断
主机字节序和网络字节序 主机字节序即内存中存储字节的方法有: 1. Little endian:将低序字节存储在起始地址 2. Big endian:将高序字节存储在起始地址 网络字序表示网络协议在处理多字节时的顺序,一律为big ...
尾数 一个小的golang库,可帮助处理主机到网络和网络到主机的字节序转换免责声明在使用此库之前,请阅读并了解Rob Pike的有关的博客文章。 长话短说,每当您需要担心代码是在小型字节序还是大型字节序计算机上运行时...
大小端字节序的介绍和相互转换。在c++中,有4个函数可以实现主机字节序到网络字节序的相互转换。
项目中需要64位数的字节序转换,主机序转换成网路序或者相反转换,写了2个函数,有需要的可以参考。
把32位正整数从网络序转换成主机字节序。 socket.ntohs(x) // 类似于C语言的ntohs(x) 把16位正整数从网络序转换成主机字节序。 socket.htonl(x) // 类似于C语言的htonl(x) 把32位正整数从主机字节序转换成网络序...
网络中表示的IP地址与主机表示不同,本程序通过转换来表示。
##第一章1.6主机字节序和网络字节序之间相互转换import socket#主机字节序和网络字节序之间相互转换def convert_integer( integer ):'''主机字节序和网络字节序之间的转换'''long_host_byte = socket.ntohl( integer...
描述了IP地址格式转换的常用接口,主机字节序和网络字节序相互转换,Ip字符串转换成long型数值;高字节序和低字节序的名词解释
5.4 主机字节序和网络字节序 163 5.4.1 字节序的含义 164 5.4.2 网络字节序的转换 164 5.5 小结 166 第6章 应用层网络服务程序简介 167 6.1 HTTP协议和服务 167 6.1.1 HTTP协议概述 167 6.1.2 HTTP...
linux点分十进制IP转换为long型 网络字节序与主机字节序互转
摘要I4 Linux 下的网络编程 14.1.3 网络字节序与主机字节序 24.2 socket 编程系统调用 34.3.1 实现思路 94.3.2 服务端代码