逆向01:数据宽度与逻辑运算

前言

在进入本章节之前,需要先理解进制的本质、逻辑运算(与、或、异或、非)。

简单来说,进制就是一组由n个符号组成的逢n进1的规则,其本质就是查表。

例如:十进制就是由0~9十个符号组成的,最小是0,最大是9,逢十进一。

数据存储

假设计算机只能存储4位二进制数,那么能存储的数据就有:

1
2
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F

数据存储图解

  • 无符号的情况下,每个存储单位的最大值是F。
  • 有符号的情况下,每个存储单位的最大值是7,最大的负数是F。
1
2
3
4
5
无符号数:0123456789ABCDEF
有符号数:
    正数: 0  1  2  3  4  5  6  7
    负数: F  E  D  C  B  A  9  8
          -1 -2 -3 -4 -5 -6 -7 -8

就有如下的数据:

1
2
3
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0    1    2    3    4    5    6    7     8    9    A    B    C    D    E    F
0    1    2    3    4    5    6    7    -8   -7   -6   -5   -4   -3   -2   -1

这就是为什么负数的二进制高位为1,其完全是使用时制定的规则。

原码、反码与补码

以十进制数15举例,其二进制为0000 1111

1
2
3
原码:0000 1111
反码:0000 1111
补码:0000 1111

正数的原码、反码、补码都相同。

以-15为例,假设计算机是以其原码的形式保存的(实际上是以补码的形式保存),那么其二进制为1000 1111

1
2
3
原码:1000 1111
反码:1111 0000
补码:1111 0001

负数的反码是其原码除符号位外全部取反。负数的补码是其在反码的基础上+1。

根据上述的数据存储规则,实际上是以补码的形式保存,因为数据的绝对值是从下向上递增,详见上方数据存储图解

计算机计算的方法

以2+3举例,2的原码为0010,3的原码为0011

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
x = 0010
y = 0011

计算:

    0010
XOR 0011
---------
    0001

R = x xor y = 0001

验算:

V = x & y << 1 == 0010 << 1 == 0100 !== 0

    0010
AND 0011
---------
    0010

因为验算值V != 0,因此需要继续计算

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
V != 0 继续计算

重新给x、y赋值:
x = 0001 == R
y = 0100 == V

    0001
XOR 0100
---------
    0101

R = 0101

验算:

    0001
AND 0100
---------
    0000

V = 0000 << 1 == 0

结论:
V == 0
R == 0101
当验算值 V == 0 时,R为结果

结果为R,也就是0101,换算成二进制则为5

最简单的加密算法

利用XOR可以进行最简单的加密算法实现。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
D为数据,K为密钥,R为计算结果

加密:

D = 0010
M = 1000
R = D XOR M = 1010

解密:

D = 1010
M = 1000
R = D XOR M = 0010

基本单位

1
2
3
4
 BYTE: 8  bit
 WORD: 16 bit = 2 BYTE
DWORD: 32 bit = 2 WORD
QWORD: 64 bit = 4 WORD = 2 DWORD

Built with Hugo
主题 StackJimmy 设计