【发布时间】:2012-10-18 03:18:19
【问题描述】:
今天早上我丢失了一堆文件,但是由于它们所在的卷在内部和外部都进行了碎片整理,因此可以获得 100% 恢复所需的所有信息;我只需要在需要的地方填写 FAT。
我编写了一个程序来执行此操作,并在我转储到文件的 FAT 副本上对其进行了测试,它运行良好,除了少数文件(526 个文件中的 17 个),FAT 链是一个单一的簇太长,因此与下一个文件交叉链接。
幸运的是,我确切地知道问题出在哪里。我在 EOF 计算中使用了ceil,因为即使超过一个字节也需要一个额外的集群:
//Cluster is the starting cluster of the file
//Size is the size (in bytes) of the file
//BPC is the number of bytes per cluster
//NumClust is the number of clusters in the file
//EOF is the last cluster of the file’s FAT chain
DWORD NumClust = ceil( (float)(Size / BPC) )
DWORD EOF = Cluster + NumClust;
此算法适用于所有文件,但大小恰好是集群大小的倍数的文件除外,在这种情况下,它们最终成为一个集群太多了。
我想了一会儿,但不知如何做到这一点。看起来应该很简单,但不知何故却出人意料地棘手。
什么公式适用于任何大小的文件?
【问题讨论】:
-
一开始为什么要把它转换成float???
-
@HotLicks,因为没有它,我会收到错误
ambiguous call to ceil…。 -
为什么你觉得有必要使用
ceil?理论上,一个 int 的ceil应该总是返回相同的 int。 -
@HotLicks,即使超过一个字节也意味着一个额外的集群,所以它总是必须四舍五入;因此
ceil。我认为这在逻辑上比尝试并依赖整数除法和隐含舍入更清晰。 -
整数除法比依赖于整数到浮点数的随机转换要可靠得多。如果你真的想使用 ceil 你需要做浮点除法,或者它基本上是一个空操作。
标签: c++ formula ceil off-by-one