假设每块大小为 4096 。
0 大小占用 0 块, 4095 占用 1 块, 4096 占用 1 块, 4097 占用 2 块。
我的办法是
$block = ($size & 4095) ? ($size | 4095) + 1: $size;
有没有更简单的算法?
反过来,(块数-1)的最简单算法又是什么?
0 大小对应 0 块, 4095 对应 0 块, 4096 对应 0 块, 4097 对应 1 块。
我说得不大清楚。准确地说,是文件占用块数的总大小,以及(块数-1)
的大小。
也即:
0 大小占用 0 Byte , 4095 占用 4096 Byte , 4096 占用 4096 Byte , 4097 占用 8192 Byte 。
0 大小对应 0 Byte , 4095 对应 0 Byte , 4096 对应 0 Byte , 4097 对应 4096 Byte 。
@geeglo @Elethom @akira ceil()
或(size + 4095) / 4096
处理(块数-1)
的时候, 0 大小对应 -4096 Byte ,需要 ugly 的处理……。
@defia 取整之后或位移 12 位之后+1 ,那么 0 大小占用 4096byte 。
@mko0okmko0 我当时分成 4k 的。
1
geeglo 2016-02-27 15:03:11 +08:00
看样子是 PHP
函数 ceil 不够用? |
2
Elethom 2016-02-27 15:30:43 +08:00 via iPhone
(size + 4095) / 4096
這樣嗎? |
3
defia 2016-02-27 16:29:34 +08:00
难道不是除法取整加一就行了么..
|
4
defia 2016-02-27 16:31:59 +08:00
当然也可以位移 12 位之后+1
|
5
akira 2016-02-27 16:33:28 +08:00
ceil(x / 4096)
@@ |
6
mko0okmko0 2016-02-27 16:33:35 +08:00
目标是磁碟真实块数量吗?
你需要先知道档案系统是用多少容量当一个块的. 当然用常用的 4K 也是可以.但这只是常用.不是定数或是真实用量. 例如存放大型档案的系统.有用 64K 当一块的. |
7
schezukNewTos OP 我说得不大清楚。准确地说,是文件占用块数的总大小,以及(块数-1)的大小。
也即: 0 大小占用 0 Byte , 4095 占用 4096 Byte , 4096 占用 4096 Byte , 4097 占用 8192 Byte 。 0 大小对应 0 Byte , 4095 对应 0 Byte , 4096 对应 0 Byte , 4097 对应 4096 Byte 。 @geeglo @Elethom @akira ceil()或(size + 4095) / 4096 处理(块数-1)的时候, 0 大小对应 -4096 Byte ,需要 ugly 的处理……。 @defia 取整之后或位移 12 位之后+1 ,那么 0 大小占用 4096byte 。 @mko0okmko0 我当时分成 4k 的。 |
8
geeglo 2016-02-27 19:58:01 +08:00
@schezukNewTos
很基础的,你应该弄错了 <?php $per = 4096; $b1 = 4095; $b2 = 4097; $b3 = 0; $x = ceil($b1/$per)*$per; $x2 = ceil($b2/$per)*$per; $x3 = ceil($b3/$per)*$per; echo $x; echo '<br/>'; echo $x2; echo '<br/>'; echo $x3; 结果: 4096 8192 0 |
9
schezukNewTos OP @geeglo 我是说(块数-1)对应的字节数。
|
10
geeglo 2016-02-27 20:14:36 +08:00
@schezukNewTos
没办法省判断。用三目运算检查一下输入的块数应该是最短的了。 |
11
schezukNewTos OP @geeglo 好吧。谢谢~~~
|