Python語(yǔ)言編程系列005——將參數(shù)打包為字節(jié)流進(jìn)行網(wǎng)絡(luò)傳輸方法(python 傳出參數(shù))
問(wèn)題提出
使用Python寫(xiě)上位機(jī)軟件時(shí),若通過(guò)網(wǎng)口向硬件端發(fā)送命令參數(shù)對(duì)儀器進(jìn)行控制,此時(shí)需要將多個(gè)參數(shù)打包為字節(jié)流數(shù)據(jù)后進(jìn)行網(wǎng)絡(luò)傳輸,那么,在Python中怎樣將多個(gè)參數(shù)打包為字節(jié)流進(jìn)行網(wǎng)絡(luò)傳輸呢?
如對(duì)于一個(gè)具體的例子,將下列參數(shù)打包成字節(jié)流通過(guò)網(wǎng)絡(luò)傳輸?shù)接布糠?,要求如下?/p>
- 整個(gè)包大小為64Byte
- 包頭為0X“FAA5 FBB5 FCC4 FDD5”
- 包尾為0X“5FA5 5FB5 5FC5 5FD5”
- 中間不足部分補(bǔ)0
- 所有參數(shù)皆為有符號(hào)整型數(shù)字,且初始值、占用字節(jié)數(shù)定義如下:
解決方法
對(duì)于這個(gè)問(wèn)題,可以使用Struct、ctypes、socket等模塊完成,其具體步驟思路為:
1、用ctypes模塊創(chuàng)建64個(gè)字節(jié)大小的發(fā)送緩沖區(qū)sendBuffer,代碼如下:
2、用struct模塊,分別定義包頭(fmt_head)、包身(fmt_body,存儲(chǔ)待發(fā)的具體參數(shù))、包尾(fmt_tail)在字節(jié)流中的數(shù)據(jù)格式,代碼如下:
3、利用struct模塊的pack_into函數(shù)將待發(fā)內(nèi)容打包到緩沖區(qū)sendBuffer,代碼如下:
其中,headInfo和tailInfo定義的是包頭、包尾的信息,即
4、通過(guò)socket模塊發(fā)送到服務(wù)器端,代碼如下:
備注說(shuō)明
上面struct模塊中支持的格式如下圖所示:
打包的后的字節(jié)順序默認(rèn)上是由操作系統(tǒng)的決定的,struct模塊提供了自定義字節(jié)順序的功能,可以指定大端存儲(chǔ)、小端存儲(chǔ)等特定的字節(jié)順序,對(duì)于底層通信的字節(jié)順序是十分重要,不同的字節(jié)順序和存儲(chǔ)方式也會(huì)導(dǎo)致字節(jié)大小的不同。在format字符串前面加上特定的符號(hào)即可以表示不同的字節(jié)順序存儲(chǔ)方式,例如采用小端存儲(chǔ) s = struct.Struct(‘<I3sf’)就可以了。其對(duì)照列表如下:
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。