`
sdutdazzling
  • 浏览: 31447 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

关于字节序(大端法、小端法)的定义

阅读更多

关于字节序(大端法、小端法)的定义
《UNXI网络编程》定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址。小端存在起始地址,即是小端字节序;大端存在起始地址,即是大端字节序。

 

也可以说: 
1.小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端。 
2.大端法(Big-Endian)就是高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端。

举个简单的例子,对于整形0x12345678。它在大端法和小端法的系统内中,分别如图1所示的方式存放。

zijiexu_pic_1 

 

网络字节序

我们知道网络上的数据流是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它是将这个字节作为高位还是低位来处理呢? 
网络字节序定义:收到的第一个字节被当作高位看待,这就要求发送端发送的第一个字节应当是高位。而在发送端发送数据时,发送的第一个字节是该数字在内存中起始地址对应的字节。可见多字节数值在发送前,在内存中数值应该以大端法存放。 
网络字节序说是大端字节序。 
比如我们经过网络发送0x12345678这个整形,在80X86平台中,它是以小端法存放的,在发送前需要使用系统提供的htonl将其转换成大端法存放,如图2所示。

zijiexu_pic_2

 

字节序测试程序 
不同cpu平台上字节序通常也不一样,下面写个简单的C程序,它可以测试不同平台上的字节序。
#include <stdio.h>
#include <netinet/in.h>
int main()
{
    int i_num = 0x12345678;
    printf("[0]:0x%x\n", *((char *)&i_num + 0));
    printf("[1]:0x%x\n", *((char *)&i_num + 1));
    printf("[2]:0x%x\n", *((char *)&i_num + 2));
    printf("[3]:0x%x\n", *((char *)&i_num + 3));
10   
11      i_num = htonl(i_num);
12      printf("[0]:0x%x\n", *((char *)&i_num + 0));
13      printf("[1]:0x%x\n", *((char *)&i_num + 1));
14      printf("[2]:0x%x\n", *((char *)&i_num + 2));
15      printf("[3]:0x%x\n", *((char *)&i_num + 3));
16   
17      return 0;
18  } 


在80X86CPU平台上,执行该程序得到如下结果: 
[0]:0x78 
[1]:0x56 
[2]:0x34 
[3]:0x12

[0]:0x12 
[1]:0x34 
[2]:0x56 
[3]:0x78

分析结果,在80X86平台上,系统将多字节中的低位存储在变量起始地址,使用小端法。htonl将i_num转换成网络字节序,可见网络字节序是大端法。

总结点:80X86使用小端法,网络字节序使用大端法。

分享到:
评论

相关推荐

    基于大端法、小端法以及网络字节序的深入理解

    关于字节序(大端法、小端法)的定义《UNXI网络编程》定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址。小端存在起始地址,即是小端字节序;大端存在起始地址,即是大端字节序。 ...

    C语言指针的定义和使用

    计算机的字节顺序模式分为大端数据模式和小端数据模式,它们是根据数据在内存中的存储方式来区分的。小端对齐和大端对齐都是计算机中数据存储的一种方式。 所有的指针类型存储的都是内存地址,内存地址都是一个无...

    iOS蓝牙4.0位运算,数据的大小端转换,一些数据补位

    在蓝牙项目的开发过程中,会遇到了一些与数据处理有关的问题,本文... 小端模式方便计算机处理,高字节保存在内存的高地址。  d. iOS中默认的是小端存储。 定义:  大端模式(Big-endian),是指数据的高字节,保存在

    memstruct:用于装配结构操作的 Java 库-开源

    MemStruct 是一个 Java 库,它提供了基本程序集结构的简单实现,以便在低级别操作和访问标记字段。... MemStruct 支持字节、字、整数、短、长和字符串数据,并提供对填充字节、大端和小端字段对齐的完全控制。

    crcany:一次计算任何CRC,一次计算一个字节,一次计算一个字

    逐字方式有两种口味,一种是面向小端的机器,另一种是面向大端的机器。 可以按字长两倍的CRC进行按位计算,例如,在具有64位整数的机器上为128位。 字节和逐字计算可以在不超过字长的CRC上完成,例如,使用64位整数...

    使用 Arrow 格式的无转换 Rust 库

    Arrow2:无转化之箭这个存储库包含一个 Rust 库来处理Arrow 格式。它是使用无转化操作重新编写的官方 Arrow crate 。...这个 crate 使用小端和大端黄金文件,因为它支持 IPC 边界的两种字节序。这个板条箱中

    C语言讲义.doc

    2.10.6 大端对齐与小端对齐 23 2.11 CHAR类型 24 2.11.1 char常量,变量 24 2.11.2 printf输出char 24 2.11.3 不可打印char转义符 24 2.11.4 char和unsigned char 25 2.12 浮点FLOAT,DOUBLE,LONG DOUBLE类型 25 ...

    20秋学期(1909、2003、2009-)《计算机病毒分析》在线作业.docx

    A:小端 B:大端 C:终端 D:前端 答案:A 以下那个窗口是操作和分析二进制的主要位置,也是反汇编代码所在的地方 A:函数窗口 B:结构窗口 C:反汇编窗口 D:二进制窗口 答案:C ()能够将一个被调试的进程转储为一个PE...

    chip8-asm64-emu:用x86-64位汇编语言编写的CHIP-8仿真器(Linux)

    该仿真器是为Linux下的x86-64平台编写的(要注意的是,数据以小端存储在内存中,主要是交换两个字节,因为CHIP-8使用大端存储)。 该文件已被大量注释,因此即使您没有汇编的经验,您也应该可以继续学习,我希望它...

    riak_pb:Riak协议缓冲区消息

    Riak协议缓冲区消息 master : develop : 该存储库包含的基于协议缓冲区的接口的消息定义,以及消息类型的各种Erlang特定的实用程序模块...length是msg_code的长度(1个字节)加上以网络顺序(大端)编码的消息长度

    galois:C 或 OpenCL 的有限域的实现

    伽罗华 这是一个用于处理的微小的、只有头文件的 C/OpenCL 库。 它主要是为 OpenCL 中的加密项目开发的... 宏ffwidth应定义为字段中的字节数。 uchar a[ffwidth]; uchar b[ffwidth]; uchar result[ffwidth]; uchar i

    linux网路编程 中文 23M 版

    1.6.4关于G P L 许町证的争议......................................... 12 1.7 Linux软件开发的可借鉴之处........................:.................. 12 1-8 ..................................................

Global site tag (gtag.js) - Google Analytics