![下载大小计数仅在 2MiB 之后从 KiB 切换到 MiB](https://linux22.com/image/1578424/%E4%B8%8B%E8%BD%BD%E5%A4%A7%E5%B0%8F%E8%AE%A1%E6%95%B0%E4%BB%85%E5%9C%A8%202MiB%20%E4%B9%8B%E5%90%8E%E4%BB%8E%20KiB%20%E5%88%87%E6%8D%A2%E5%88%B0%20MiB.png)
我曾经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。
它是一个开源项目。您可以添加功能请求来更改行为,或者克隆该项目并自行更改。