V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
schezukNewTos
V2EX  ›  程序员

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

  •  
  •   schezukNewTos · 2016-02-27 15:00:37 +08:00 · 2534 次点击
    这是一个创建于 3199 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设每块大小为 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 条附言  ·  2016-02-27 18:55:58 +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 的。

    11 条回复    2016-02-27 20:17:21 +08:00
    geeglo
        1
    geeglo  
       2016-02-27 15:03:11 +08:00
    看样子是 PHP

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

    這樣嗎?
    defia
        3
    defia  
       2016-02-27 16:29:34 +08:00
    难道不是除法取整加一就行了么..
    defia
        4
    defia  
       2016-02-27 16:31:59 +08:00
    当然也可以位移 12 位之后+1
    akira
        5
    akira  
       2016-02-27 16:33:28 +08:00
    ceil(x / 4096)
    @@
    mko0okmko0
        6
    mko0okmko0  
       2016-02-27 16:33:35 +08:00
    目标是磁碟真实块数量吗?
    你需要先知道档案系统是用多少容量当一个块的.
    当然用常用的 4K 也是可以.但这只是常用.不是定数或是真实用量.
    例如存放大型档案的系统.有用 64K 当一块的.
    schezukNewTos
        7
    schezukNewTos  
    OP
       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
        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
    schezukNewTos
        9
    schezukNewTos  
    OP
       2016-02-27 20:00:47 +08:00
    @geeglo 我是说(块数-1)对应的字节数。
    geeglo
        10
    geeglo  
       2016-02-27 20:14:36 +08:00
    @schezukNewTos
    没办法省判断。用三目运算检查一下输入的块数应该是最短的了。
    schezukNewTos
        11
    schezukNewTos  
    OP
       2016-02-27 20:17:21 +08:00
    @geeglo 好吧。谢谢~~~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1917 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:36 · PVG 08:36 · LAX 16:36 · JFK 19:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.