手機探索者開發實錄 資料轉換器 Transformer

2022-10-17 07:33:07 字數 1371 閱讀 8492

作者****:李先靜

我們決定用xml來打包資料,藉以避免二進位制的晦澀,以及位元組順序和位元組對齊的問題。這會引出乙個小小的麻煩,有些字元和字串行是不允許出現在xml文件中的,因為xml用它們來表示自己的語法,比如大/小於號和引號,xml也不允許二進位制資料出現在裡面,它只能表示文字內容,而且按統一的標準編碼。

要傳輸二進位制資料,我們需要對資料做些轉換。其中空間效率比較高的轉換可能是base64編碼了,它能用64個基本字元編碼任何二進位制資料,它被發明的目的好像是為了在郵件中傳輸二進位制資料,它以8位傳輸資料表示6位有效資料(每6位資料編碼為乙個字元)。但我不想使用它,原因是它不夠直觀,當你看到一串base64編碼的字串,很難直接推出它原本的字串(如果你認為它能加密,那也錯了,乙個簡單的程式就能」解密」它們)。

最後我決定選擇十六進製制編碼,它能以8位資料表示4位有效資料,雖然比base64差了點,不過要直觀一些,可以根據這些十六進製制資料看出原本的資料,比如30表示原來的數字0,而且實現也更簡單。

很多情況下我們傳輸的是字串,它們用十六進製制編碼也可以,只是有些浪費空間,也不夠字串本身直觀。因此我們可以採用另乙個更有效的編碼方式,也就是實體(entity)編碼,比如小於號可以編碼為《或者&#x 3c;,這種方法看起來效率低得出奇,你需要4個或者6個字元才能表示乙個字元,所幸的是我們只需要編碼那些與xml文件衝突的字元,這樣的字元在普通字串**現的概率不高,所以這種編碼的整體表現是很優秀的。

我們有兩種編碼方法了,也不排除最後我們因為效率原因退回來使用base64,更甚者我們還會引入加密或壓縮的編碼方法進來,所以我們有必要為資料編碼定義乙個介面,針對介面編碼,把變化的部分隔離開來:

1 typedef meret (*mobileexplorertransformertransformfunc)

2 (mobileexplorertransformer* thiz, mobileexplorerbuffer* input, mobileexplorerbuffer* output);

3 typedef meret (*mobileexplorertransformergettypefunc)

4 (mobileexplorertransformer* thiz, metransformtype* type);

5 typedef meret (*mobileexplorertransformerdestroyfunc)(mobileexplorertransformer* thiz);

6 7 struct _mobileexplorertransformer

8 ;1

c語言中的介面定義很簡單,它是乙個包括一組函式指標的結構,可以認為它們是一組純虛函式。函式指標是乙個抽象的東西,它們指到不同的函式上,物件就具備不同的行為,也就是傳說中的多型。上面的transfom是這個介面的核心,它負責資料的轉換。

樹童,傾聽十五年 課程探索者 課堂創新者 課題引領者

初始的親密接觸,讓李總對以激發學生興趣為主的課程產生了濃厚的興趣。這一課程設定改變了傳統以知識傳授為主的教學模式,強調學生在一種愉快的氛圍中說英語。為親自檢驗這種新的英語教學模式的效果,1997年正讀大三的她於暑假回到家鄉河南信陽,開辦了第乙個英語培訓班。回想第乙個英語培訓班,李總記得很清楚,共招收...

手機開不了機怎麼辦

相信大部分人都遇到過手機開不了機的情況,針對智慧型機和非智慧型機可能都有不同的原因,但總體來說主要有以下的這些情況,遇到手機開不了機不必著急,對照下面的情況逐一排查,一般都可以解決。一 開機線不正常引起的不開機 正常情況下,按開機鍵時,開機鍵的觸發端電壓應有明顯變化,若無變化,一般是開機鍵接觸不良或...

我解決 小 公尺手機開不了機的辦法

我解決 小 公尺 手機開不了機 充不進電 只是紅燈閃爍的辦法現象 手機自動關機了,回家充電,紅燈快速閃爍,充一上午後仍是這樣,黑屏 不顯示充電,充不進電,開不了機。想著 上網找,網上講的原因各種各樣,提供的解決辦法也各種各樣,但是都解決不了我的問題。然而,有一點可以很定 手機和電池都沒有壞。不過問題...