
假设每块大小为 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 好吧。谢谢~~~ |