在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节序列中最小的地址。对表示一个对象的字节序列排序有两个规则:大端法和小端法。
最低有效字节在最前面的方式被称为小端法(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 ...
根据所使用的处理器类型和操作系统,主机字节序可能是大端或小端。例如,大多数基于x86架构的个人电脑使用小端字节序。 #### 网络字节序 网络字节序是一种标准化的字节序形式,用于网络数据传输。在网络通信中,...
利用宏将网络字节序和主机字节序ip格式化输出为字符串ip
网络字节序和主机字节序 在计算机科学中,字节序(Endianness)是指整数在内存中保存的顺序。不同的 CPU 有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。 常见的有两种字节序:...
网络字节序与主机字节序
网络字节序 主机字节序
用C语言写的判断主机字节序的代码,一共有2种方法判断
在上一篇文章网络编程:主机字节序和网络字节序中,介绍了主机字节序和网络字节序的基本概念以及在实际的编程中,何时需要进行网络字节序和主机字节序的转换。本篇文章着重介绍使用c++和python语言,如何实现主机...
判断主机到底是大端还是小端的c程序!利用位置判断
上述两个示例代码均实现了将一个16位的端口号`6000`从主机字节序转换为网络字节序,然后再将其转回主机字节序的过程。输出结果表明转换过程正确无误。 #### 六、总结 掌握大小端字节序以及网络字节序的相关知识对于...
1. `htons()`(Host to Network Short):将主机字节序的短整型(16位)转换为网络字节序。 2. `ntohs()`(Network to Host Short):将网络字节序的短整型转换为主机字节序。 3. `htonl()`(Host to Network Long)...
主机字节序和网络字节序 主机字节序即内存中存储字节的方法有: 1. Little endian:将低序字节存储在起始地址 2. Big endian:将高序字节存储在起始地址 网络字序表示网络协议在处理多字节时的顺序,一律为big ...
例如,`htonl`函数将主机字节序的32位整数转换为网络字节序,`ntohl`则是将网络字节序的32位整数转换回主机字节序。 在实际编程中,我们还需要考虑到字节序问题可能影响到的数据结构,比如结构体(struct)。如果...
在跨平台的网络编程中,字节序转换函数如htonl(主机到网络字节序,long)、ntohl(网络到主机字节序,long)、htons(主机到网络字节序,short)和ntohs(网络到主机字节序,short)非常常见,它们确保数据在网络上...
尾数 一个小的golang库,可帮助处理主机到网络和网络到主机的字节序转换免责声明在使用此库之前,请阅读并了解Rob Pike的有关的博客文章。 长话短说,每当您需要担心代码是在小型字节序还是大型字节序计算机上运行时...
STM32F103通常是小端字节序,但如果你需要在不同字节序的系统间交换数据,可能需要进行字节序转换,例如使用`ntohl`(网络字节序到主机字节序)和`htonl`(主机字节序到网络字节序)函数。 以上就是关于STM32F103上...
本文档将涵盖嵌入式工程师笔试题的相关知识点,包括C语言中的volatile关键字、TCP/IP协议的分层结构、网络字节序与主机字节序的转换、静态函数和静态变量的使用、内存复制函数的实现等。 1. C语言中的volatile...
在C或C++程序中,这样的头文件通常会提供接口,使得程序员可以在运行时将字节序从主机字节序(即当前处理器使用的字节序)转换为网络字节序或反之。 以下是一些可能包含在"swap_io.h"中的关键知识点: 1. **字节序...
在编程中,我们需要将主机字节序转换为网络字节序,或者将网络字节序转换为主机字节序。为此,我们可以使用以下函数: * htons():将 16 位的主机字节序转换为网络字节序 * htonl():将 32 位的主机字节序转换为...
2. **主机字节序**(HOST byteorder):主机字节序指的是运行程序的计算机硬件所使用的字节序。在描述中提到的“HOST byteorder”,意味着数据结构在内存中按照当前处理器的字节序来存储。 3. **内存中的数据结构**...