FilesLast commitLast update
18 days ago
18 days ago
18 days ago
README

500GB 硬盘只有 465GB,100M 宽带只有 12.5MB/s:单位进制实测

买回来一块 500GB 的硬盘,装进系统只显示 465GB。

办了一条 100M 的宽带,测速只有 12.5MB/s。

两个数字都不是虚标,是两套单位进制在打架。

我把这两件事做成一个单文件网页,里面有容量换算器、硬盘标称对照表、网速换算器和一张 SI 与 IEC 的逐级对照表,右上角还有 10 项自检,加载时自己跑一遍,结果是 10/10 通过。

图 1:页面首屏——左边两块「为什么」,右边是 10/10 通过的自检面板

在线案例与源码:https://atomgit.com/deli007/demo_park/tree/main/codearts-data-unit-lab 成品只有一个 index.html,双击就能打开。下面每个数字都是我在页面里读回来的。

一、为什么值得看:同一个字节数,怎么算出两个数字

硬盘厂商按 SI 十进制标称,1 GB 就是 10 的 9 次方,等于 1,000,000,000 字节。

系统按 IEC 二进制统计,1 GiB 是 2 的 30 次方,等于 1,073,741,824 字节。

500 GB 换成 GiB 要除以 1,073,741,824,得数 465.66。

字节一个没少,只是换了一套进制去读,读出来的数字就变小了。

Windows 沿用旧写法,把 GiB 直接标成 "GB",这一步最容易被当成故障。

宽带那边的 M 是 Mbps,是位;下载速度用的 MB/s,是字节。

一字节等于 8 位,100 Mbps 除以 8 才是 12.5 MB/s。

二、准备环境:进入码道 Web

浏览器打开码道 Web 版:https://devcloud.cn-north-4.huaweicloud.com/chat?source=dmzntgwsf&sourcead=dmzntgwwbwz ,登录后在对话框里写需求,就能拿到一个能跑的单文件应用,不用装软件。

码道有三种使用方式:WebUI(浏览器对话)、TUI(终端命令行)和桌面 IDE(IDE 插件)。本文用 WebUI 版演示。

三、需求原文:把要算的数字写死在需求里

这一轮我把关键数字全部写进了需求,不让模型自己去回忆。

六行硬盘对照的期望值、四档宽带的期望值、10 条自检断言,一条条列在需求里。

需求原文如下,可以直接复制。

做一个单文件网页应用「数据单位换算实验室」,只需要一个 index.html,不引入任何外部依赖、不用 CDN、不发任何网络请求,所有计算都在浏览器本地完成,界面用中文。

要讲清楚两件事:为什么 500GB 的硬盘在系统里只显示 465GB;为什么 100M 宽带下载速度只有 12.5MB/s。

必须包含下面 5 个面板:

1) 容量换算器:输入数字 + 单位下拉(B / KB / MB / GB / TB / PB / KiB / MiB / GiB / TiB / PiB),同时输出精确字节数、SI 十进制表示的 KB/MB/GB/TB、IEC 二进制表示的 KiB/MiB/GiB/TiB。GB 走 1000 进制,GiB 走 1024 进制。

2) 硬盘标称 vs 系统显示对照表:128GB、256GB、500GB、1TB、2TB、4TB 六行,列出标称字节数、系统显示的 GiB、看起来少了多少 GB。数字必须算准:500GB=500000000000 字节=465.66 GiB;1TB=931.32 GiB;128GB=119.21 GiB;256GB=238.42 GiB;2TB=1862.65 GiB;4TB=3725.29 GiB。

3) 网速换算器:输入 Mbps,输出 MB/s(= Mbps ÷ 8),以及下载 1GB 和 1GiB 文件各需要多少秒;再给一张 100M / 300M / 500M / 1000M 四档对照表。

4) 单位进制对照表:把 SI(KB=1000、MB、GB、TB、PB)和 IEC(KiB=1024、MiB、GiB、TiB、PiB)逐级并排对照,每级都给出对应的字节数。

5) 常见坑清单,以及一个自检面板:页面加载时逐条运行 10 条断言,并显示每条通过或失败和实际计算值。

交互要求:当用户输入非法内容(例如 -5、abc、留空)时,对应面板里要用红色文字提示「请输入一个非负数字」,不显示任何结果数字,不能出现 NaN 或 Infinity。

完成后打开预览,让我直接看到运行效果。

四、一屏五块

页面从上往下是五块。

第一块是容量换算器,输入数字加单位,同时给出精确字节数和 SI、IEC 两套结果。

第二块是硬盘标称对照表,六行,从 128GB 排到 4TB。

第三块是网速换算器,输入 Mbps,输出 MB/s 和下载 1GB、1GiB 的耗时。

第四块是 SI 与 IEC 逐级对照表,从 KB 一路排到 PB。

第五块是常见坑清单,收的都是看着像故障、其实是单位混用的情况。

五、实测:容量换算与六行对照表

输入 500、单位选 GB,点换算,页面给的精确字节数是 500,000,000,000 字节。

换成 IEC 是 465.661287 GiB,SI 侧一行行读下来是 500,000,000 KB、500,000 MB、500 GB、0.5 TB。

这个数是 BigInt 算的,页面里读回来是整整齐齐的 500,000,000,000,没有出现科学计数法。

图 2:输入 500 GB 之后的结果,精确字节数在上,SI 与 IEC 两列并排在下

硬盘标称那一块是六行固定对照,我把它整张抄下来。

标称容量 标称字节数 系统显示的 GiB 看起来少了多少 GB
128 GB 128,000,000,000 119.21 GiB 8.79 GB
256 GB 256,000,000,000 238.42 GiB 17.58 GB
500 GB 500,000,000,000 465.66 GiB 34.34 GB
1 TB 1,000,000,000,000 931.32 GiB 68.68 GB
2 TB 2,000,000,000,000 1,862.65 GiB 137.35 GB
4 TB 4,000,000,000,000 3,725.29 GiB 274.71 GB

最右一列就是同一个字节数在两套进制下的差,容量本身一个字节都没丢。

图 3:六行对照表,从 128GB 到 4TB,最右列是两套进制的差

六、网速那一块:100M 为什么只有 12.5 MB/s

输入 100,页面给出 100 Mbps = 12.5 MB/s。

下载 1GB(1,000,000,000 字节)要 80.0 秒,下载 1GiB(1,073,741,824 字节)要 85.9 秒。

四档带宽它并排列出来了。

带宽档位 MB/s 下载 1GiB 耗时
100M 宽带 12.5 MB/s 85.9 秒(1 分 25.9 秒)
300M 宽带 37.5 MB/s 28.6 秒
500M 宽带 62.5 MB/s 17.2 秒
1000M 宽带 125 MB/s 8.6 秒

1000M 也只有 125 MB/s,除以 8 这一步没有例外。

图 4:网速换算器与四档对照表,1000M 一行的 125 MB/s 最扎眼

12.5 MB/s 是理论上限,页面自己也标了一句:TCP/IP 协议头、Wi-Fi 衰减、路由损耗都会再打折,一般再打 8 到 9 折。

七、验证与踩坑:非法输入、科学计数法和一个 24 位整数

那 10 项自检是页面加载时现场跑的,这次读回来是 10/10 通过。

我把每一项的实际值都核对了一遍:1 GiB 是 1073741824 字节,1 TiB 是 1099511627776 字节,12 MB/s 等于 96 Mbps,100 Mbps 等于 12.5 MB/s。

失败路径我拿 -5 试的,页面给出红色提示,原文是「请输入一个非负数字」,同时把结果区收了起来,没有输出 NaN,也没有 Infinity。

abc、留空、只敲一个空格,走的是同一条拦截路径。

图 5:输入 -5 之后,容量换算器给出红色提示,结果区不再显示

踩到的第一个真边界是科学计数法:输入 1e6 会被拦掉,这个换算器只认普通数字和小数写法。

第二个是超长整数:我输入 24 个 9,页面输出 999999999999999999999999000000000 字节,一位不差。

浮点算这个数会掉精度,页面在这一步用了 BigInt。

第三个是小数:输入 0.5 得到 500,000,000 字节,换算器吃小数,但不做四舍五入展示。

八、边界与取舍

下面几条是我这一轮实测出来的真边界。

第一,对照表里那列「少了多少 GB」只算两套进制之差,不含格式化开销。

真机上 NTFS、exFAT 的元数据、RAID 冗余、SSD 预留空间还会再吃掉一部分,页面没有把这一层算进去。

第二,网速换算给的是理论上限,页面自己标了实测通常再打 8 到 9 折。

第三,科学计数法输入被拒,只认十进制写法,这是刻意的,免得把 1e6 读成 1000000 之后又和用户预期不一致。

第四,自检只在页面加载时跑一次,不是持续监控。

第五,内存那一条我按页面说法写:内存颗粒按 2 进制制造,8GB 内存就是 8 GiB,不缩水。

九、使用码道的体会

  • 把六行对照的期望值写进需求,生成出来的表第一版就对,省掉了来回核对。
  • 断言要写成「页面自己报数」,10/10 这种数字比「测试通过」四个字可信。
  • 非法输入的提示原文要写进需求,这一条让失败路径有了能核对的东西。
  • 数字一律标注单位,页面上每一行都带 GB、GiB、MB/s,读起来不起歧义。
  • 布局上我让它一屏放下,截图时不用来回滚。

一句实在的话:码道把可运行的第一版做得很快,但这个页面能不能当换算尺用,取决于你把验收数字写得多具体。

十、直接下载试玩

这个 Demo 已经完整开源,源代码、本文档、五张截图都在公开仓库里。

把 index.html 下载到本地,用浏览器打开,就能自己改输入、切单位,看着两套进制一起变。

十一、本地复现与下一步

本地跑两步就够。

git clone https://atomgit.com/deli007/demo_park.git
cd demo_park\codearts-data-unit-lab
python -m http.server 8080

浏览器打开 http://localhost:8080/index.html ,把输入从 500 换成 1000,能看到 GiB 那一列从 465.66 变成 931.32。

下一步我打算补两件事:一是给容量换算器加上文件系统开销的估算,把格式化之后真正可用的容量也算出来;二是把内存、显存、流量这几个场景的单位混用也收进常见坑清单。