本文将对一些常识性的知识进行说明,博主尽量做到细致,如有不清楚的请在下方留言。

一、数据存储的字节序与位序。

关于计算机中数据的表示方法,以及二进制、十六进制和编码啥的博主就不说了。。这些知识点估计能跑过来看我博客的应该都清楚吧,而且我相信任何一本计算机科学相关的教科书都会讲的比我清楚详细。这里我主要说说与数据恢复相关的常识。
主要需要注意的一点就是字节序与位序。

1.1、字节序

1.1.1什么叫字节序呢?

在几乎所有的机器上,多字节对象都被存储为连续的字节序列。例如在C语言中,一个类型为int的变量x地址为0x100,那么其对应地址表达式&x的值为0x100。且x的四个字节将被存储在存储器的0x100, 0x101, 0x102, 0x103位置。
而存储地址内的排列则有两个通用规则。一个多位的整数将按照其存储地址的最低或最高字节排列。如果最低有效位在最高有效位的前面,则称小端序;反之则称大端序

上述文字摘自维基百科

1.1.2、小端序

小端序(英:little-endian)或称小尾序。是一种小值得一端存储在前的顺序,也就是低位在前,高位在后的存储方法,反序排列。

这和我们日常的书写习惯恰恰相反,而在现代计算机中,确广泛采用了这种字节序,这就需要我们注意了。例如winhex中显示的01 02 03 04而我们在进行人工读取时应当视为04 03 02 01

1.1.3、大端序

大端序(英:big-endian)或称大尾序。是一种大值端在前的顺序,高位在前,低位在后。这和我们的日常习惯相符。

1.2、位序

上边我们讲的是字节序,那么进入每个字节中去,其中的8位是否也分为大端序与小端序呢,事实上也有这种之分,但是呢在现在计算机系统中从CPU到程序的设计中几乎都采用了大端序的方式。因此我们无需担心,按照正常的阅读习惯读取就行了。

二、数据的运算

关于数据的运算其实是一个很庞大的学科。博主只是蜻蜓点水,并不能深入,这里只讲讲winhex 数据编辑中所涉及到的几种简单运算。

2.1、加减运算(add)

见文知意,就是简单的加减运算。winhex中允许上下溢出。也就是说当原值在加减某个数后将舍弃溢出部分,例如FDH+6H=02其溢出部分被舍弃了

2.2、反转字节顺序

也很简单,例如16bit byte swap就是指每2字节进行顺序反转
32bit byte swap就是每4字节进行字节顺序反转。例如

原字节顺序01 02 03 04 05 06 07 08

进行两字节顺序交换后变为02 01 04 03 06 05 08 07,

进行四字节顺序交换后变为04 03 02 01 08 07 06 05.

2.3、左移与右移

学过计算机相关知识的同学应该很清楚左移与右移的含义,简单说就是将将一个数的各二进制位全部左移或右移若干位。然后空出的高位或低位直接补0.

2.3、位移

这更好理解,其实这并不算是数据运算。只是将数据的位置移动了一下。就是将你选中的数据一起向后移动若干字节。只是移动位置,并不改变数据内容。

2.4、反转位

其实我觉得更好的叫法是翻转位,他的含义就是将各各二进制位进行取反。例如00100000反转位后变为11011111

2.5、逻辑与、或、非、异或

  • 逻辑与又称逻辑乘。其运算规则如下:

|A | B | C |
|:-:|:-:|:-:|
|1 |1 |1 |
|1 |0 |0 |
|0 |1 |0 |
|0 |0 |0 |
一句话概括同真为真,其余为假

  • 逻辑或又称逻辑加。其运算规则如下:

|A | B | C |
|:-:|:-:|:-:|
|1 |1 |1 |
|1 |0 |1 |
|0 |1 |1 |
|0 |0 |0 |
一句话概括同假为假,其余为真

  • 异或运算,这种运算在数据恢复中运用的比较多的一种运算(现实情况不一定,博主仅针对博主所参加的赛项而言),因为这种运算具有可逆性。其运算规则如下:

|A | B | C |
|:-:|:-:|:-:|
|1 |1 |0 |
|1 |0 |1 |
|0 |1 |1 |
|0 |0 |0 |
一句话概括相同为0相异为1

先扯到这里吧,以后想到啥再写。。。

<p align="center">本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。</p>

Last modification:April 23rd, 2018 at 03:12 pm
If you think my article is useful to you, please feel free to appreciate