如何把文件大小换算成占用块数?

2016-02-27 15:00:37 +08:00
 schezukNewTos

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

2450 次点击
所在节点    程序员
11 条回复
geeglo
2016-02-27 15:03:11 +08:00
看样子是 PHP

函数 ceil 不够用?
Elethom
2016-02-27 15:30:43 +08:00
(size + 4095) / 4096

這樣嗎?
defia
2016-02-27 16:29:34 +08:00
难道不是除法取整加一就行了么..
defia
2016-02-27 16:31:59 +08:00
当然也可以位移 12 位之后+1
akira
2016-02-27 16:33:28 +08:00
ceil(x / 4096)
@@
mko0okmko0
2016-02-27 16:33:35 +08:00
目标是磁碟真实块数量吗?
你需要先知道档案系统是用多少容量当一个块的.
当然用常用的 4K 也是可以.但这只是常用.不是定数或是真实用量.
例如存放大型档案的系统.有用 64K 当一块的.
schezukNewTos
2016-02-27 18:56:10 +08:00
我说得不大清楚。准确地说,是文件占用块数的总大小,以及(块数-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 的。
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
schezukNewTos
2016-02-27 20:00:47 +08:00
@geeglo 我是说(块数-1)对应的字节数。
geeglo
2016-02-27 20:14:36 +08:00
@schezukNewTos
没办法省判断。用三目运算检查一下输入的块数应该是最短的了。
schezukNewTos
2016-02-27 20:17:21 +08:00
@geeglo 好吧。谢谢~~~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/259490

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX