xqe530 发表于 2009-8-24 15:56:53

如果多运行中最高位大于等于8,即1000(最高位为1),是否需要按以下方法操作?

---------------------------------------------
以下是取自本论坛另一坛友文章。


以下是小弟初学NTFS底层结构时遇到一问题,即MFT中80H属性的数据运行。

单一的运行很好理解,但是多运行,有一个疑问,为什么子运行3要取反加1,fd7a0d怎么就是一个负数呢

望高手解答,不胜感激。以下是NTFS底层结构原文中的一段

214806243101f3aa   0231010d7afd3101
f338023101c34b05   00a26b81d0503de1
该运行分为
子运行1:21480624
子运行2:3101f3aa02
子运行3:31010d7afd
子运行4:3101f33802
子运行5:3101c34b05
以子运行1:“21480624”为例,“2”表示后面4个字节中后面2个字节是子运行的起始簇号,即子运行的起始簇号为“24 06”,“1”

表示前面的1个字节表示子运行的大小,即该子运行的大小为“48”。所以该文件数据实际是从起始扇区号为0x2406的地方,占用0x48个簇。接

下来是子运行2,运行2的簇号的起始位置为0x2406 + 0x02aaf3 = 0x2cef9。占用0x01个簇。接下来是子运行3,按照前面的理论,子运行3的起

始簇号应该是0x2cef9+0xfd7a0d。但是 0xfd7a0d的第一个字节为1(fd的首字节),证明此数为负数,所以不能简单的做加法,而应该取该数

的补数来计算。既,0xfd7a0d取反加1,得到0x2F5F2,所以运行3的起始扇区号为0x2cef9 - 0x285f3 = 0x4096。占用0x01个簇。依此类推直到

子运行之后为“00”时结束。

----------------------------------------------

针对于上面的子运行3起始簇号,我个人理解是这样。

第1种方法:

由于子运行3是0Xfd7a0d,最高位是1(即f的最高位是1),故应用0X1000000-0Xfd7a0d=0X285f3

再由子运行2的起始簇号减去上步骤得出的数:0x2cef9-0x285f3=0x4096

故子运行3起始位置是0x4096


第2种方法

由于子运行3是0Xfd7a0d,故最高位是1(即f的最高位),故先直接将子运行2与子运行3相加,即0X2cef9+0Xfd7a0d=0X1004906

再砍去最高位1(0X1004906去除第1位),即得到0x004906

故子运行3起始位置是0x4906


问题:如果运行中最高位大于等于8,即1000(最高位为1),是否就需要按以上方法进行操作呢?

xqe530 发表于 2009-8-25 10:45:56

没有人顶,自己先顶一下。
页: [1]
查看完整版本: 如果多运行中最高位大于等于8,即1000(最高位为1),是否需要按以下方法操作?