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

1.2.3 BufferViewer

Demo展示

本節(jié)實現(xiàn)了一個最簡單的十六進制查看工具——BufferViewer,如圖1-8所示。

BufferViewer實現(xiàn)了如下功能。

·打開任意文件,查看其十六進制數(shù)據(jù)。

·隨機生成100字節(jié)的十六進制數(shù)據(jù),并查看。

·將十六進制轉(zhuǎn)換為Base64編碼表示。

·將Base64編碼表示轉(zhuǎn)換回十六進制表示。

·判斷Base64編碼是否合法。

完整的代碼可以在ch01/01_BufferViewer中查閱。

img

圖1-8 BufferViewer界面

使用VS2022打開rtcbook.sln,在Solution Explorer中,右鍵單擊01_BufferViewer工程,單擊Set as Startup Project,再次右鍵單擊Build,即可運行啟動。

工程說明

作為本書的第一個示例工程,我們詳細介紹一下各個代碼文件的作用。

源碼的組織形式如圖1-9所示。

主界面使用了WTL(Windows Template Library),這是微軟維護的一個輕量級UI庫,只有純頭文件,無須庫文件。

主窗口的實現(xiàn)位于MainDlg.h中,這是一個派生自WTL的對話框類。

我們可以通過消息函數(shù)處理表的宏定義,為其添加各種消息函數(shù),從而實現(xiàn)從UI操作到功能的調(diào)用。

img

為了方便代碼復用,本書將所有示例工程的公用代碼都放置于Common文件夾下。這些公用代碼具有很強的復用性,可以被多個示例同時使用。

依據(jù)公用代碼的功能不同,Common下又分為多個文件夾。

·Base:緩存、文字編碼、線程等。

·Video:視頻相關算法。

·Audio:音頻相關算法。

·File:文件格式相關。

·Data:數(shù)據(jù)處理相關。

·Net:網(wǎng)絡相關算法。

img

圖1-9 源碼的組織結(jié)構(gòu)

我們看一段從文件加載到Buffer并顯示其十六進制格式的代碼。

img

第3行,CFileDialog表示W(wǎng)TL提供打開文件對話框用來獲取用戶所選擇的文件。

第7行,DFile類是一個文件封裝處理類,用來加載文件到內(nèi)存。

第8行,DXP類有兩個方法:ws2s和s2ws,用作Unicode與MBCS之間字符集的轉(zhuǎn)換,下一節(jié)會詳細介紹。

第9~10行,我們最多讀取100 KB的數(shù)據(jù)到內(nèi)存中。

第11行,DBuffer類將數(shù)據(jù)從文件讀取到內(nèi)存中。

第12行,我們使用DBuffer的ToHexList方法,將其轉(zhuǎn)換為十六進制表示。

第13行,m_hex是一個CEdit的成員對象,這也是WTL提供的一個封裝類,用來實現(xiàn)一個多行的文本框。我們將轉(zhuǎn)換好的文本內(nèi)容貼上去展示。

經(jīng)過這些基礎類的封裝,整個代碼的易讀性都得到了明顯的提升。

以二進制/十六進制形式查看任何數(shù)據(jù),是我們理解任何計算機技術的基礎。

只有細到每一比特,才能真正理解計算機程序的運行規(guī)律。

總結(jié)

本節(jié)我們介紹了比特和字節(jié)的基本概念,了解了十六進制與Base64編碼。為了能方便地管理字節(jié),我們設計了一個基于引用計數(shù)的Buffer類。我們開發(fā)了一個十六進制查看器,用來演示Buffer類。后續(xù),我們會經(jīng)常用它來分析各種媒體文件格式。

參考閱讀

1.斯坦福大學的Sean Eron Anderson搜集了大量有關bit的算法。

2.Programming Pearls(1999年),More Programming Pearls(1988年),Jon Louis Bentley著,介紹了一些關于位運算的黑科技。

3.Base64編碼的細節(jié),請參考RFC 4648。

4.WTL的atlmisc.h中有一個CString類的實現(xiàn),包含了更多字符串操作的內(nèi)容。

5.WinHEX是Windows平臺下一款好用的十六進制編輯器。macOS平臺下則有hexdump顯示工具。

練習題

1.[30分鐘](交換字節(jié)序)編寫一個交換字節(jié)序的函數(shù)。

2.[2小時](Bitset)設計一個Bitset類,支持按bit來訪問4字節(jié)長度的二進制數(shù)據(jù)。

3.[1人天](BitStream)設計一個BitStream類,支持按bit來獲取一段長度的比特流。

4.[1人天](Base58編碼)Base58是比特幣采用的一種二進制編碼方式,它使用了哪些字符編碼?有什么優(yōu)勢?

5.[30分鐘](判斷2的冪)寫一個函數(shù),判斷一個整數(shù)是否是2的冪。

6.[30分鐘](求二進制數(shù)1的個數(shù))寫一個函數(shù),求一個整數(shù)中有多少個二進制的1。

7.[30分鐘](無分支的截取)寫一個函數(shù),給定任意無符號整數(shù)v,若v大于255,則返回255,否則返回v,不能使用條件判斷或問號表達式。

8.[30分鐘](無分支的絕對值)寫一個函數(shù),給定任意整數(shù)v,返回v的絕對值,不能使用條件判斷或問號表達式。

主站蜘蛛池模板: 桂林市| 无棣县| 会同县| 屏边| 吴桥县| 辽宁省| 临邑县| 梅河口市| 永吉县| 凤城市| 邳州市| 宿州市| 汝南县| 康保县| 荆州市| 北碚区| 茂名市| 沈丘县| 进贤县| 博客| 屏东县| 泸溪县| 梅河口市| 日土县| 社旗县| 家居| 兴业县| 林甸县| 三门峡市| 永嘉县| 黄梅县| 西乡县| 吉安县| 丁青县| 象山县| 陆川县| 东港市| 陆丰市| 滨海县| 荔波县| 抚远县|