下载大小计数仅在 2MiB 之后从 KiB 切换到 MiB

下载大小计数仅在 2MiB 之后从 KiB 切换到 MiB

我曾经pacman在命令行上用它更新我的 Manjaro 系统。我注意到进度使用 KiB 来测量下载的数据量。在达到 2048 KiB 后,它会更改为 MiB(很有可能;从上一个切换到下一个的时间非常短,无法通过观察完全验证)。我的问题是:为什么只在 2048 KiB 而不是 1024 KiB 时才将其更改为 MiB?它很可能被显示为 1 MiB。

答案1

将其更改为 2048 KiB 而不是 1024 KiB 的理由是什么?

开发人员决定按如下方式编码:

/** Converts sizes in bytes into human readable units.
 *
 * @param bytes the size in bytes
 * @param target_unit '\0' or a short label. If equal to one of the short unit
 * labels ('B', 'K', ...) bytes is converted to target_unit; if '\0', the first
 * unit which will bring the value to below a threshold of 2048 will be chosen.
 * @param precision number of decimal places, ensures -0.00 gets rounded to
 * 0.00; -1 if no rounding desired
 * @param label will be set to the appropriate unit label
 *
 * @return the size in the appropriate unit
 */
double humanize_size(off_t bytes, const char target_unit, int precision,
        const char **label)
{
    static const char *labels[] = {"B", "KiB", "MiB", "GiB",
        "TiB", "PiB", "EiB", "ZiB", "YiB"};
    static const int unitcount = ARRAYSIZE(labels);

    double val = (double)bytes;
    int index;

    for(index = 0; index < unitcount - 1; index++) {
        if(target_unit != '\0' && labels[index][0] == target_unit) {
            break;
        } else if(target_unit == '\0' && val <= 2048.0 && val >= -2048.0) {
            break;
        }
        val /= 1024.0;
    }

    if(label) {
        *label = labels[index];
    }

    /* do not display negative zeroes */
    if(precision >= 0 && val < 0.0 &&
            val > (-0.5 / simple_pow(10, precision))) {
        val = 0.0;
    }

    return val;
}

来源util.c\pacman\src - pacman.git - 官方 pacman 仓库


它很可能被表示为 1 MiB。

它是一个开源项目。您可以添加功能请求来更改行为,或者克隆该项目并自行更改。

相关内容