进制在逆向的基础知识也是占重要的一环的,学好了进制无疑在逆向这一块不会感到一大串字符/字符串带给自己的迷茫,甚至不会被刚刚接触脱壳,反编译等看到头晕,还有很多…我就不一一细讲,反正学好进制对逆向来说还是很基础的,那么让我为这逆向或编程世界尽自己一份绵薄之力吧!(大佬勿喷)

十进制转任意进制
利用短除法除以‘进一数”,比如说十进制转为八进制,只要用十进制数除以八,然后取后面的余数,一直除到 0,然后倒序输出,其输出的值就是转换的值比如说
十进制44转换为二进制:44/2=22余0
22/2=11余0
11/2=5余1
5/2=2余1
2/2=1余0
1/2=0余1
因此最后结果为0101100

字丑别见怪哈

正确

下面我们来看看八进制的,比如说十进制71转换为八进制,我们有了前车之鉴
那么
下一步就是 71/8=8余7
8/8=1余0
1/8=0余1
因此最后结果为10107
备注:当被除数小于除数的时候,一般取商为0,而余数是被除数本身
好的,十进制转为十六进制
十六进制是逢十六进一
并且前九个是整数0到9,而后六个是 a,b,c,d,e,f(windows 不区分,大小写,因此在vs和windows计算器下是不区分大小写的)
下面我们开始演示十进制数17转换为十六进制数 依旧短除法
17/16=1余1
1/16=0余1
因此最后结果为11
好了接下来我们来演示八进制转为十进制,二进制转为十进制,十六进制转为十进制
所运用的原理方法:辗转位权相加法
没听过,没关系,操作看一遍就会
比如说八进制数075
怎么转换呢,看操作
0x8^2 +7x8^1 + 5x8^0 =61
焕然一新吧,其实就是从最右边取一位起,按照“进制值(075)”分别乘以他们的”进制数(8)“从右边起的序列数减一的数字的次方,然后分别相加即可
同理,我们把二进制数1001101转换为十进制如下:
1x2^0 + 0x2^1 + 1x2^2 + 1x2^3 +0x2^4 + 0x2^5 + 1x2^6=77
16进制转十进制 同理

0x5A转换为十进制为:10x16^0 + 5x16^1=90
可以看到十六进制转换为了十进制,那么还有一个问题要问了,那么任意进制间的转换呢,到这里我们不妨想出一个规律我们可以通过任意进制转换为十进制,也可以通过十进制转为任意进制,说到这是不是就恍然一新了呢,没错,十进制就是在各个进制间的转换中起到***中转站***的作用

但也还是有个方法来实现任意进制间的转换,我只举一个例子,看好了

二进制转十六进制:在二进制中4位最大的是1111(十进制:15),这在十六进制用F表示,因此我们可以由此得出4位二进制数都在十六进制的单个字符/或整数的范围当中,那么,我们就可以把一串二进制数字每4个4个的分,然后从每单独的4个计算,然后整体相加即可,同理,八进制也不例外,在二进制中3位最大的是111(7),然后还是每3个分割,然后单独计算,然后整体相加,说明下,这个可逆向转换比如说 二进制的10101101转换为十六进制为AD
好了,进制就先讲到这里吧,下面我们来讲下第二节吧
数据存储和运算间原码,反码,补码之间转换

那么,慨念性的东西不进行深入探讨,我们知道,十进制转换为二进制或符号位+二进制数据

=原码
反码是原码按位取反(正数反码是本身,只有反码是负数时反码才按位取反,而符号位是0的为正数,反之符号位为一的是负数,符号位在这个数据的最高位,最左边的位置)
补码是原码按位取反后末尾+1,即当原码为负数时

如果一个数据是正数的话,不需要过多操作,三码合一

比如说 int a =9
的原码=00000000 00000000 0000000 00001001
反码=00000000 00000000 0000000 00001001
补码=00000000 00000000 0000000 00001001
可以看到三码合一

int b =-15
原码=10000000 00000000 0000000 00001111
反码=111111111 111111111 11111111 11110000
补码=111111111 111111111 11111111 11110001

备注下:计算机中都是以二进制补码方式进行运算的,并且存储的
因此我们可以得到:计算机中的计算都是围绕补码进行的,大致过程如下,先把数据转换为补码,然后计算他们的结果,但结果是补码形式,所以要重新转换为原码,所以呢就有如下操作:
把补码当作是原码,再进行补码的操作,然后再存储在内存中
例子:a:补码=00000000 00000000 0000000 00001001
b:补码=111111111 111111111 11111111 11110001
a+b:补码=111111111 111111111 11111111 11111010
这时把a+b当作是原码,对他进行补码操作,记住,要先算反码,再进行补码操作
a+b:“反码”=10000000 00000000 0000000 00000101
ab::“原码”=10000000 00000000 0000000 00000110
备注:如果超出字节数,只取后32位(从右往左数)
补充:其实还有运用位运算符号进行运算,我提供其中一个公式:

  举个例子 3+5
  3的原码形式为0011 
  5的原码形式为0101
  所以:0011+0101=(0011^0101)+(0011&0101)<<1=(0110+0001)<<1=1110
  具体的可以看:![在这里插入图片描述](https://img-blog.csdnimg/20200310130016235.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyOTQzNjgw,size_16,color_FFFFFF,t_70)
  更具体的可去这个博主 出的文章具体介绍https://blog.csdn/BIGBIGPPT/article/details/88919783?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158380426119725222455768%2522%252C%2522scm%2522%253A%252220140713.130056874..%2522%257D&request_id=158380426119725222455768&biz_id=0&utm_source=distribute.pc_search_result.none-task

更多推荐

进制中二进制,八进制,十进制,十六进制之间的转换,以及数据存储和运算间原码,反码,补码之间转换