可以自己做網(wǎng)站賺錢嗎小程序制作
作者簡(jiǎn)介: 一個(gè)平凡而樂(lè)于分享的小比特,中南民族大學(xué)通信工程專業(yè)研究生在讀,研究方向無(wú)線聯(lián)邦學(xué)習(xí)
擅長(zhǎng)領(lǐng)域:驅(qū)動(dòng)開(kāi)發(fā),嵌入式軟件開(kāi)發(fā),BSP開(kāi)發(fā)
作者主頁(yè):一個(gè)平凡而樂(lè)于分享的小比特的個(gè)人主頁(yè)
文章收錄專欄:網(wǎng)絡(luò)socket編程之溫度采集智能存儲(chǔ)與上報(bào)項(xiàng)目,本專欄為網(wǎng)絡(luò)socket編程之溫度采集智能存儲(chǔ)與上報(bào)項(xiàng)目技術(shù)簡(jiǎn)介,實(shí)現(xiàn)流程分析
項(xiàng)目源碼:https://gitee.com/TJF865975/project1_ds18b20,README部分包含項(xiàng)目功能及實(shí)現(xiàn),歡迎大家Watch、Star、Fork。
歡迎大家點(diǎn)贊 👍 收藏 ? 加關(guān)注哦!💖💖
1.JSON格式
1.1 JSON格式簡(jiǎn)介
JSON是一種獨(dú)立于語(yǔ)言和平臺(tái)、輕量級(jí)的數(shù)據(jù)交換格式,全稱JavaScript對(duì)象表示法(JavaScript Object Notation)。起初來(lái)源于JavaScript這門語(yǔ)言,后來(lái)隨著使用的廣泛,幾乎每門開(kāi)發(fā)語(yǔ)言都有處理JSON的API。
優(yōu)點(diǎn):易于人的閱讀和編寫(xiě),易于程序解析與生產(chǎn)。比XML更小、更快、更易解析。
JSON樣例:首先一個(gè)花括號(hào){},整個(gè)代表一個(gè)對(duì)象,同時(shí)里面是一種Key-Value的存儲(chǔ)形式,以逗號(hào)進(jìn)行分割。
{"name": "林黛玉","sex": "女","parents": [{"father": "林如海","mother": "賈敏"}],"husband": null,"unmarried": true,"friends": [{"sex": "男","name": "賈寶玉"},{"sex": "女","name": "史湘云"},{"sex": "女","name": "賈探春"}]
}
1.2 JSON數(shù)據(jù)類型
數(shù)據(jù)結(jié)構(gòu):對(duì)象(Object)、數(shù)組(Array)。
基本類型:string(在雙引號(hào)中),number(整點(diǎn)或浮點(diǎn)型),Boolean(true,false),null。
1.2.1 對(duì)象Object
形式: {key:value, key:value…}
key:string類型;
value:任何基本類型或數(shù)據(jù)結(jié)構(gòu);
1.2.2 Array
形式: [value, value…]
value:任何基本類型或數(shù)據(jù)結(jié)構(gòu)。
實(shí)例:
{"name": "林黛玉","sex": "女","talent": ["詩(shī)","棋",{"樂(lè)器": "古琴"}]
}
2.TLV格式
2.1 TLV格式簡(jiǎn)介
2.1.1 TLV格式演變
通常需要處理類似字節(jié)流的流式數(shù)據(jù),那么會(huì)面臨一個(gè)問(wèn)題就是當(dāng)數(shù)據(jù)流源源不斷的傳輸,如何知道數(shù)據(jù)流中從哪個(gè)點(diǎn)開(kāi)始到那個(gè)點(diǎn)結(jié)束是一個(gè)完整的數(shù)據(jù)呢?
定長(zhǎng)記錄
定義每個(gè)記錄的固定長(zhǎng)度。讀方讀取到了固定的長(zhǎng)度之后,即認(rèn)為獲得了完整數(shù)據(jù),每讀取固定長(zhǎng)度之后,就認(rèn)定為獲取了完整數(shù)據(jù)。
缺點(diǎn):固定長(zhǎng)度必須取最大數(shù)據(jù)大小,如果其中多數(shù)的數(shù)據(jù)比較的小,那么會(huì)造成空間浪費(fèi)。
變長(zhǎng)記錄+分隔符
定義每個(gè)記錄的固定長(zhǎng)度。讀方讀取到了固定的長(zhǎng)度之后,即認(rèn)為獲得了完整數(shù)據(jù),每讀取固定長(zhǎng)度之后,就認(rèn)定為獲取了完整數(shù)據(jù)。
定長(zhǎng)長(zhǎng)度+變長(zhǎng)記錄
定義一個(gè)固定長(zhǎng)度的塊來(lái)作為記錄頭,該記錄頭用來(lái)存放后面記錄的長(zhǎng)度。記錄頭后始終跟著該塊描述的長(zhǎng)度的記錄;每個(gè)記錄頭的長(zhǎng)度都是固定的。
讀方讀取了記錄頭獲取了記錄長(zhǎng)度,再讀取對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)獲得完整數(shù)據(jù)。
TLV格式
TLV是一種可變格式,意思就是:
Type類型, Lenght長(zhǎng)度,Value值;
Type和Length的長(zhǎng)度固定,一般那是2、4個(gè)字節(jié)(這里統(tǒng)一采用4個(gè)字節(jié));
Value的長(zhǎng)度有Length指定;
基于定長(zhǎng)長(zhǎng)度+邊長(zhǎng)記錄的方式,多加了一個(gè)類型字段。這樣讀方就可以根據(jù)不同類型的記錄做不同的處理邏輯。
TLV優(yōu)缺點(diǎn):
優(yōu)點(diǎn):記錄長(zhǎng)度動(dòng)態(tài),節(jié)省空間與處理時(shí)間;可以針對(duì)不同類型的記錄做不同的處理,可擴(kuò)展性、簡(jiǎn)單易學(xué)、 跨語(yǔ)言特性
缺點(diǎn):因?yàn)槠湓黾恿?個(gè)額外的冗余信息,tag 和len,特別是如果協(xié)議大部分是基本數(shù)據(jù)類型int ,short, byte. 會(huì)浪費(fèi)幾倍存儲(chǔ)空間。另外Value具體是什么含義,需要通信雙方事先得到描述文檔,即TLV不具備結(jié)構(gòu)化和自解釋特性。
2.1.2 定長(zhǎng)不定長(zhǎng)
描述Value部分所占字節(jié)的個(gè)數(shù),編碼格式分兩類:定長(zhǎng)方式(DefiniteForm)和不定長(zhǎng)方式(IndefiniteForm),其中定長(zhǎng)方式又包括短形式與長(zhǎng)形式。
- 短形式:
字節(jié)第7位為0,表示Length使用1個(gè)字節(jié)即可滿足Value類型長(zhǎng)度的描述,范圍在0~127之間的。 - 長(zhǎng)形式:
即Value類型的長(zhǎng)度大于127時(shí),Length需要多個(gè)字節(jié)來(lái)描述,這時(shí)第一個(gè)字節(jié)的第7位置為1,0~6位用來(lái)描述Length值占用的字節(jié)數(shù),然后直將Length值轉(zhuǎn)為byte后附在其后,如: Value大小占234個(gè)字節(jié)(11101010),由于大于127,這時(shí)Length需要使用兩個(gè)字節(jié)來(lái)描述,10000001 11101010
2.2 編碼方法
- 將類型type用htonl轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序,指針偏移+4
- 將長(zhǎng)度length用htonl轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序,指針偏移+4
- 若值value數(shù)據(jù)類型為int、char、short,則將其轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序,指針偏移+4;若值為字符串類型,寫(xiě)進(jìn)后,指針偏移+length
重復(fù)上述三步,繼續(xù)編碼后面的 TLV 單元。
2.3 解碼方法
- 讀取type 用ntohl轉(zhuǎn)換為主機(jī)字節(jié)序得到類型,指針偏移+4
- 讀取lengh用ntohl轉(zhuǎn)換為主機(jī)字節(jié)序得到長(zhǎng)度;指針偏移+4
- 根據(jù)得到的長(zhǎng)度讀取value,若value數(shù)據(jù)類型為int、char、short,用ntohl轉(zhuǎn)換為主機(jī)字節(jié)序,指針偏移+4;若value數(shù)據(jù)類型為字符串類型,指針偏移+length
重復(fù)上述三步,繼續(xù)讀取后面的 TLV 單元。