驾驭大端和小端

教你连忙精通大端和小端

教您飞速领会大端和小端学习底层编制程序或逆向的童鞋,确定对那多少个名词并不素不相识吧?!后天就给大家介绍一下这四个概念.科学普及:大端和小端,老外叫Big-Endian和Little-Endian,其实指的都以同1个东东!在Computer界,表示数据在存款和储蓄器中的存放顺序.分化的CPU、操作系统对待数据的囤积格局各有不相同,但一般常见的操作系统都是小端,而广播发表协议则是多方面。但并不是说系统是小端方式积攒,文件就肯定要运用小端的方式,区别的应用程序对于自个儿数据的积存方式也半斤八两(自家数据爱咋放咋放,有个别还打乱了加密啊),比如:
*Adobe PS –大端 *BMP –小端 *GIF –小端 *JPEG –大端 *MacPaint –大端 *RTF –小端那么小端和三头有哪些差别吗?举个栗子咱们就明知道:比方0x1234567捌以此数: *大端法在内部存款和储蓄器中按字节依次存放为:1二 34
5六 7八 *小端法在内部存款和储蓄器中按字节依次存放为:7八 56
3四 十一分解:大端:较高的有效字节存放在很低的存款和储蓄器地址,很低的有效字节存放在较高的存款和储蓄器地址。例如整型变量0x1234567八占陆个字节,那么依据内部存款和储蓄器地址从小到大它们的寄放方式如下:

 

数据 0x12 0x34 0x56 0x78
地址 0x10000000 0x10000001 0x10000002 0x10000003

读书底层编制程序或逆向的童鞋,料定对那八个名词并不目生吧?!前天就给咱们介绍一下那四个概念.

小端:较高的有效字节存放在较高的的存款和储蓄器地址,异常的低的有效字节存放在异常低的存款和储蓄器地址。所以整型变量0x1234567八依照内部存款和储蓄器地址从小到大它们的寄放方式如下:

 

数据 0x78 0x56 0x34 0x12
地址 0x10000000 0x10000001 0x10000002 0x10000003

科普:

退换:我们发掘二个字节是足以存放多少个十6进制的数字的(贰个字节最大能够存放的数是0xFF),那假设给你一个拾进制数(比方11223三),怎样快速地通晓它在内部存款和储蓄器中是什么存放的吗?l大端法很轻便,直接将它转换到十6进制,然后逐壹存放就能够:0x000一B66九l小端法则比较费心,步骤依次如下:
*转换到十6进制数(0x0001B66玖) *将6个人数字的低3人和高三人沟通(0xB66捌仟一) *在低3个人和高贰人中,分别开始展览两两调换(0x6玖B60100)怎么着检查测试你的机器是多方面依然小端?前面已经说过,常见的村办计算机大大多都以选择小端,不过大家都以自家退换世界的工程师,不要紧思念小如何使用代码来分辨?其实轻巧,通过将int强转为插入单字节,推断其实积累地方:#include
<stdio.h>int main(){ int a = 0x2233; char *b =&a; if (*b ==0x22)
{ printf; } else { printf; } return
0;}<ignore_js_op>图片 1

多方和小端,老外叫 Big-Endian 和 Little-Endian,其实指的都是同多个东东!在计算机界, 表示数据在存款和储蓄器中的存放顺序. 不相同的 CPU、操作系统对待数据的积存情势各有分裂,但貌似常见的操作系统都以小端,而报导协议则是多方面。

但并不是说系统是小端情势储存,文件就势必要采用小端的款式,不相同的应用程序对于本人数据的囤积情势也春兰秋菊(自家数据爱咋放咋放,有些还打乱了加密吧),比如:

       *Adobe PS — 大端

       *BMP — 小端

       *GIF — 小端

       *JPEG — 大端

       *MacPaint — 大端

       *RTF — 小端

那正是说小端和绝超过半数有怎么着分别吧?举个栗子我们就明知道:

比如 0x12345678 这个数:

       *大端法在内部存款和储蓄器中按字节依次存放为:1贰 34
5陆 7八

       *小端法在内部存储器中按字节依次存放为:7⑧ 56
34 1贰

 

解释:

三头:较高的有效字节存放在非常的低的存款和储蓄器地址,十分的低的有效字节存放在较高的存款和储蓄器地址。

譬如整型变量 0x1234567八 占 4 个字节,那么根据内部存款和储蓄器地址从小到大它们的寄放情势如下:

  

数据

  

0x12
0x34
0x56
0x78
地址
0x10000000
0x10000001
0x10000002
0x10000003

小端:较高的有效字节存放在较高的的存款和储蓄器地址,十分低的有效字节存放在好低的存款和储蓄器地址。所以整型变量0x12345678 依据内部存款和储蓄器地址从小到大它们的存放方式如下:

  

数据

  

0x78
0x56
0x34
0x12
地址
0x10000000
0x10000001
0x10000002
0x10000003

 

转换:

大家发掘一个字节是足以存放三个十6进制的数字的(七个字节最大可以存放的数是 0xFF),这假设给你二个10进制数(比如 112233),怎样急迅地精晓它在内存中是何许存放的吧?

l  大端法很轻松,直接将它转换到十陆进制,然后逐一存放就可以:0x0001B66玖

l  小端法则相比劳苦,步骤依次如下:

       *转变来十6进制数(0x000一B66玖)

       *将8位数字的低2人和高二人调换(0xB66玖仟1)

       *在低4人和高中贰年级个人中,分别实行两两调换(0x6九B60100)

如何检验你的机器是多方面依然小端?

眼下已经说过, 常见的私有计算机大多数都以应用小端, 但是大家都以自身退换世界的技术员, 无妨思量小如何利用代码来识别?

骨子里轻易, 通过将int强转为插入单字节, 判别其实储存地点:

#include <stdio.h>

int main()

{

        int a = 0x2233;

        char *b =(char *)&a;

        if (*b ==0x22)

        {

                printf(“大端!\n”);

        }

        else

        {

               printf(“小端!\n”);

        }

        return 0;

}

<ignore_js_op>图片 2