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