MB、MiB与Mbps之间的区别与联系

这个话题的由头是在HCIE-Datacom试听课程中老师提到了以太网集线器(Ethernet Hub)可以工作在10BASE-T以太网中,而其中的数字10指的是带宽(Bandwidth)也就是数据传输速率为10 Mbit/s,也可以写作10 Mbps。这两者的M前缀都是mega的符号表示,mega等同于\(10^6\)。众所周知1 Byte = 8 bits,所以可以得出10 Mbit/s = 10/8 MB/s = 1.25 MB/s

以上的推论看起来似乎没什么问题,但转念一想不对啊,我的概念里不应该是1 MB = 1024 KB = 1024*1024 B,这乘数\(10^6\)\(2^{20}\)都不一样怎么能直接除8呢?于是转而Google之搞清楚了其中的细节对错:

  1. 老师是对的我是错的
  2. 历史原因这两单位容易被不规范使用(混用、误用)
  3. 1 MB = 1000 KB = 1000*1000 B
  4. 1 MiB = 1024 KiB = 1024*1024 B

MB(megabyte)

megabyte是信息计量单位byte的倍数单位,多用于信息技术领域表示数据量1。其前缀mega国际单位制(International System of Units,SI)规定的单位前缀,符号为M。因其换算关系为10的幂次,又被称为十进制前缀。

国际单位制由国际计量局(Bureau international des poids et mesures,BIPM)制定,查阅其官方网站和标准文档都有相关的描述

Decimal multiples and submultiples of SI units can be written using the SI prefixes listed below:

Name Symbol Multiplying factor
quetta Q \(10^{30}\)
ronna R \(10^{27}\)
yotta Y \(10^{24}\)
zetta Z \(10^{21}\)
exa E \(10^{18}\)
peta P \(10^{15}\)
tera T \(10^{12}\)
giga G \(10^{9}\)
mega M \(10^{6}\)
kilo k \(10^{3}\)
hecto h \(10^{2}\)
deca da \(10^{1}\)
deci d \(10^{-1}\)
centi c \(10^{-2}\)
milli m \(10^{-3}\)
micro µ \(10^{-6}\)
nano n \(10^{-9}\)
pico p \(10^{-12}\)
femto f \(10^{-15}\)
atto a \(10^{-18}\)
zepto z \(10^{-21}\)
yocto y \(10^{-24}\)
ronto r \(10^{-27}\)
quecto q \(10^{-30}\)

MiB(mebibyte)

mebibyte同样是信息计量单位byte的倍数单位,其前缀mebi国际电工委员会(International Electrotechnical Commission,IEC)规定的单位前缀,符号为Mi,由国际单位制(International System of Units,SI)的十进制单位前缀mega衍生而来,词源为megabinary。因其换算关系为2的幂次,又被称为二进制前缀。

该单位在 IEC 60027-2 标准中描述,该标准已被各国际组织广泛接受2,目前最新的版本是 IEC 60027-2:2019 。IEC 最早在 IEC 60027-2:1972/AMD2:1999 作出了明确定义并与国际单位制的十进制前缀区分。没有找到历史版本的文档可以下载,贴一个博客上看到的图3。另外该博主是在实际应用中发现的该问题,比较具有参考价值。

image-202307192235190

Mbps(megabit per second)

megabit per second与前两者不同,用于衡量数据传输速率,是bit per second的倍数单位。Mbps是其符号Mbit/sMb/s的常见缩写,其前缀mega同样是国际单位制(International System of Units,SI)规定的单位前缀,符号为Mbit per second的符号是bit/s,是bits的导出单位,同样具有二进制前缀的版本mebibit per second,符号Mibit/s

以下是摘自维基的表格:

Name Symbol Multiple Multiple
bit per second bit/s 1 1
Metric prefixes (SI)
kilobit per second kbit/s \(10^{3}\) \(1000^{1}\)
megabit per second Mbit/s \(10^{6}\) \(1000^{2}\)
gigabit per second Gbit/s \(10^{9}\) \(1000^{3}\)
terabit per second Tbit/s \(10^{12}\) \(1000^{4}\)
Binary prefixes (IEC 80000-13)
kibibit per second Kibit/s \(2^{10}\) \(1024^{1}\)
mebibit per second Mibit/s \(2^{20}\) \(1024^{2}\)
gibibit per second Gibit/s \(2^{30}\) \(1024^{3}\)
tebibit per second Tibit/s \(2^{40}\) \(1024^{4}\)

实际验证

以上是标准制定的理想情况,实际上由于标准制定晚于实际应用,这是一个历史遗留问题,有许多场合存在单位的错用混用情况。为了防止大家错用单位,其实 SI 标准文档里在其单位前缀的描述部分还作了相应提示:

The SI prefixes refer strictly to powers of 10. They should not be used to indicate powers of 2 (for example, one kilobit represents 1000 bits and not 1024 bits).

有趣的是大部分人印象中的1 MB = 1024 KB = 1024*1024 B并不只是来源于教科书,还来源于生活日常使用各种软件。例如微软的Windows操作系统,同一个文件拷贝到macOS操作系统后变大、1TB容量硬盘显示只有930GB容量,就是因为Windows使用的是十进制前缀的符号TBGBMBKB,换算关系则是用的二进制前缀的 \(2^{40}\)\(2^{30}\)\(2^{20}\)\(2^{10}\)。而硬盘厂商和macOS则规范使用了单位与换算关系,所以一直都是巨硬错了,而不是硬盘厂商或苹果的macOS。(虽然微软已经在修正这个历史遗留问题了

有哪些事实没有一定计算机知识的人不会相信? - Qi K的回答 - 知乎 https://www.zhihu.com/question/288115796/answer/523089229

非常意外地发现很多软粉在评论区疯狂地为微软洗地???

如果你要教育我说微软这样改不符合用户习惯,有兼容性问题等等等等,我建议你免开尊口,因为微软已经在改了。我举一个例子:

StrFormatByteSizeA function (shlwapi.h) - Win32 apps

这是一个名叫StrFormatByteSizeA的Win32 API函数。它的作用是将字节数转换成以KB、MB结尾的字符串。这个函数的文档里有这么一句话:

In Windows 10, size is reported in base 10 rather than base 2. For example, 1 KB is 1000 bytes rather than 1024.

从Windows 10开始,这个函数返回的不再按照1024进位的方式转换,而是采用国际单位制(SI)的规则,返回1000进位转换后的结果。

说白了,微软并不认为一个小小的转换、一个简单的字符串会有什么兼容性问题,API这种最不应该改的东西说改就改了,其余的还不改无非就是懒得动弹,或者傲娇而已。

博主顺道在macOS Monterey 12.6.6系统做了下验证:

首先查看man-pages描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ man dd

bs=n Set both input and output block size to n bytes, superseding the
ibs and obs operands. If no conversion values other than noerror,
notrunc or sync are specified, then each input block is copied to
the output as a single block without any aggregation of short
blocks.

Where sizes or speed are specified, a decimal, octal, or hexadecimal number
of bytes is expected. If the number ends with a “b”, “k”, “m”, “g”, “t”,
“p”, or “w”, the number is multiplied by 512, 1024 (1K), 1048576 (1M),
1073741824 (1G), 1099511627776 (1T), 1125899906842624 (1P) or the number of
bytes in an integer, respectively. Two or more numbers may be separated by
an “x” to indicate a product.

$ man ls

-h When used with the -l option, use unit suffixes: Byte, Kilobyte,
Megabyte, Gigabyte, Terabyte and Petabyte in order to reduce the
number of digits to four or fewer using base 2 for sizes. This
option is not defined in IEEE Std 1003.1-2008 (“POSIX.1”).

生成相应字节数的文件后分别在终端和访达查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ dd if=/dev/zero of=1KiB.file bs=1k count=1
1+0 records in
1+0 records out
1024 bytes transferred in 0.000066 secs (15515152 bytes/sec)
$ dd if=/dev/zero of=1MiB.file bs=1m count=1
1+0 records in
1+0 records out
1048576 bytes transferred in 0.000274 secs (3826919708 bytes/sec)
$ dd if=/dev/zero of=1GiB.file bs=1g count=1
1+0 records in
1+0 records out
1073741824 bytes transferred in 0.747626 secs (1436201823 bytes/sec)
$ ls -lS
total 2099208
-rw-r--r-- 1 user group 1073741824 7 12 22:48 1GiB.file
-rw-r--r-- 1 user group 1048576 7 12 22:48 1MiB.file
-rw-r--r-- 1 user group 1024 7 12 22:48 1KiB.file
$ ls -lhS
total 2099208
-rw-r--r-- 1 user group 1.0G 7 12 22:48 1GiB.file
-rw-r--r-- 1 user group 1.0M 7 12 22:48 1MiB.file
-rw-r--r-- 1 user group 1.0K 7 12 22:48 1KiB.file

访达似乎对于小文件不愿意显示小数点后面的数字 image-20230712230405095

另外群晖的DSM操作系统里1TB硬盘和Windows一样也显示为930GB(\(10^9/2^{30}*10^3\))

image-202307201240320

说到这其实并没有完全的对与错,只需要在一些严肃的场合明确区分就没有问题了(o^^o)


  1. Wikimedia Foundation (2023) Megabyte, Wikipedia. Available at: https://en.wikipedia.org/wiki/Megabyte (Accessed: 18 July 2023).↩︎

  2. Wikimedia Foundation (2023) Megabyte, Wikipedia. Available at: https://en.wikipedia.org/wiki/Megabyte (Accessed: 18 July 2023).↩︎

  3. Wang, W. (2022) 1K bit = 1024 bit?, 17哥. Available at: https://wangwei1237.github.io/2022/06/19/Does-1Kbit-equal-1024bit/ (Accessed: 19 July 2023).↩︎