- RTC程序設計:實時音視頻權威指南
- 戴維
- 1540字
- 2024-05-14 10:03:24
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所示。

圖1-3 Byte的構成
字節是計算機世界中計量大小的基本單位,例如:1KB=1024 Byte,1MB=1024 KB,1GB=1024 MB。這里1024=210。
為了方便表示二進制,人們將其4位一組,使用0~F這16個字符進行十六進制編碼,如表1-2所示。
表1-2 數的進制表示

所以,一字節的表示范圍是0~255,即十六進制的0x00~0xFF。
字節序
字節用來表示整數時,存在存儲順序的問題。
例如,0x12345678,在內存中的存儲可能是0x12、0x34、0x56、0x78,也可能是0x78、0x56、0x34、0x12。前者被稱為大端法(Big-Endian),后者被稱為小端法(Little-Endian)。小端法表示法如圖1-4所示。

圖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下的各種比特率單位

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

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編碼表

使用A~Z、a~z、0~9、+和/,正好64個字符,來編碼6 bit的一組。
由于字節是8 bit一組的,當字節數不是3的倍數時,比特數不能被6整除。
Base64編碼使用等號字符=在最后做附加(padding),最終可能是3種情況:沒有=,1個=,或者2個=,表示此Base64串末尾有多少個附加字節,如圖1-5所示。

圖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個字符,便于二進制數據的文本展示。
- Vue.js入門與商城開發實戰
- GitLab Repository Management
- D3.js 4.x Data Visualization(Third Edition)
- Mastering Android Development with Kotlin
- Scala程序員面試算法寶典
- C語言程序設計
- RealSenseTM互動開發實戰
- 21天學通C++(第5版)
- JavaScript腳本特效編程給力起飛
- 零基礎學C語言程序設計
- HTML5+CSS3+jQuery Mobile APP與移動網站設計從入門到精通
- 大數據時代的企業升級之道(全3冊)
- R語言與網站分析
- Java與Android移動應用開發:技術、方法與實踐
- 精通Rust(第2版)