官术网_书友最值得收藏!

1.2.1 一切皆比特

比特

在計算機世界里,一切復雜的數據背后,都是二進制數的0和1。在中文里,我們稱這樣最小的單元為1位。在英文中,對應的術語是binary digit,簡稱比特(bit)。

1940年,圖基(John Tukey,美國,1915—2000)首次發明了縮寫bit。

1948年,香農(Claude Shannon,美國,1916—2001)在著作A Mathematical Theory of Communication中使用了術語bit。

從比特的視角來理解計算機技術,可以直接洞悉問題的本質,不被編程語言的語法所困擾。

字節

將8 bit分為一組,我們定義了字節(Byte)。

1956年6月,IBM的工程師維爾納·布赫霍爾茲(Werner Buchholz,德裔美籍,1922—2019),在IBM 7030 Stretch的早期設計階段,首次使用了Byte這個術語,用來表示數字信息的基本單元。

最早的字節并非8 bit。《計算機程序設計的藝術》一書中的MIX機器采用6 bit作為1 Byte。8 bit的Byte約定,和IBM System/360大型機的研發有關,由其領導者布魯克斯(Frederick P.Brooks,美國,1931—2022)推行開來。

對于單字節中的位,從左到右,我們依次編號為bit7~bit0,如圖1-3所示。

img

圖1-3 Byte的構成

字節是計算機世界中計量大小的基本單位,例如:1KB=1024 Byte,1MB=1024 KB,1GB=1024 MB。這里1024=210

為了方便表示二進制,人們將其4位一組,使用0~F這16個字符進行十六進制編碼,如表1-2所示。

表1-2 數的進制表示

img

所以,一字節的表示范圍是0~255,即十六進制的0x00~0xFF。

字節序

字節用來表示整數時,存在存儲順序的問題。

例如,0x12345678,在內存中的存儲可能是0x12、0x34、0x56、0x78,也可能是0x78、0x56、0x34、0x12。前者被稱為大端法(Big-Endian),后者被稱為小端法(Little-Endian)。小端法表示法如圖1-4所示。

img

圖1-4 小端法表示法

比如,在計算機系統的本地內存中,Intel 與ARM架構常使用小端法表示法,也叫作本機序(Host Order)。而在網絡傳輸上,人們習慣于使用大端法,即網絡序(Net Order)。

又如,BMP文件使用的是小端法,而MP4文件使用的是大端法。

位序

圖1-3所定義的位存儲在字節內的順序是固定的。但是我們在讀取位的時候,會存在兩個方向:從bit0讀到bit7,或從bit7讀到bit0。

例如,對于0x39=0b 00111001,從不同的方向讀取,就會得到00111001或者10011100兩種結果。

后面我們會看到,位序對于理解圖像格式和壓縮算法都是非常重要的。例如,對于PNG、GIF圖像格式,位序是從bit0開始的。但是對于JPEG圖像格式,位序則是從bit7開始的。

比特流與比特率

對于計算機中連續存儲的字節單元,我們可以將其看作一個比特流

為了衡量信息的傳遞速度,我們定義比特率為每秒鐘傳送的比特,單位為bps(bit per second)。比特率也稱為碼率

表1-3反映了國際單位制SI(International System of Units)下的各種比特率單位[9]

表1-3 國際單位制SI下的各種比特率單位

img

表1-4是一些常見傳輸設備的比特率。

表1-4 一些常見傳輸設備的比特率

img

bps中的b是小寫的。對于字節,用大寫的B表示Byte,1 Bps=8 bps。

在音視頻通話時,若帶寬小于300 kbps,則我們稱之為低帶寬

低帶寬下RTC優化標準為:純音頻最低支持60 kbps,音視頻最低支持100 kbps。

Base64表示法

十六進制通過將4 bit分為一組,得到了0x00~0x0F這16種不同的值。

在早期,由于歷史原因,電子郵件只允許傳輸英文字符數據[10]。當傳輸非字符數據時,網關(Gateway)會將字節中8位的最高位置為0。

為了能將二進制值用英文字符表示出來,人們設計了Base64編碼

Base64編碼將6 bit分為一組,并用26=64個不同的字符來表示,如表1-5所示。

表1-5 Base64編碼表

img

使用A~Z、a~z、0~9、+和/,正好64個字符,來編碼6 bit的一組。

由于字節是8 bit一組的,當字節數不是3的倍數時,比特數不能被6整除。

Base64編碼使用等號字符=在最后做附加(padding),最終可能是3種情況:沒有=,1個=,或者2個=,表示此Base64串末尾有多少個附加字節,如圖1-5所示。

img

圖1-5 Base64編碼

例如,將0x01轉換為Base64編碼。

0x01對應的比特為0b00000001,由于不是3的倍數,我們將其附加2字節,得到0b 00000001 00000000 00000000,再將其6 bit一組,得到0b 000000 010000 000000 000000。查表得知,000000=A,010000=Q。因此,0x01的Base64編碼為AQ==。

同理,0x01 02的Base64編碼為AQI=,0x01 02 03的Base64編碼為AQID。

使用Base64編碼,會使原數據變長約三分之一。但好處是只使用了65個字符,便于二進制數據的文本展示。

主站蜘蛛池模板: 南汇区| 洞头县| 林西县| 南郑县| 河南省| 英超| 定襄县| 治县。| 神农架林区| 新郑市| 桦川县| 祁连县| 乐亭县| 伊通| 白水县| 雷州市| 自贡市| 辉南县| 达孜县| 辉南县| 文山县| 涪陵区| 公主岭市| 丹巴县| 临西县| 桃源县| 望谟县| 阜平县| 盐城市| 合川市| 贵定县| 高陵县| 夹江县| 万宁市| 巫溪县| 曲阜市| 手游| 南京市| 集安市| 阿拉善右旗| 陕西省|