中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中怎么自定義pack和unpack

發布時間:2021-11-25 09:09:02 來源:億速云 閱讀:171 作者:iii 欄目:互聯網科技

這篇文章主要介紹“python中怎么自定義pack和unpack”,在日常操作中,相信很多人在python中怎么自定義pack和unpack問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”python中怎么自定義pack和unpack”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

什么是粘包問題?

因為TCP協議是流式協議所以數據包之間沒有邊界,有時會因為操作系統緩存機制、網絡延遲等原因造成2次間隔時間較短、數據量較少的數據合并成一次發送。因此影響了數據的完整性。

粘包問題解決策略:

常見的解決方式是通過自定義協議厘清數據包之間的邊界。
發送方
1.發送數據包前先計算長度,再將int型長度數據轉換成4字節的bytes型;
2.先發送4字節bytes型長度數據,再發送數據包。
接收方
1.先接收4字節bytes型長度數據,將其轉換成int型長度數據。
2.只接收指定長度的數據。
以上協議是服務端和終端雙方均要遵守的自定義協議。這樣就可以解決粘包問題。

區分消息和文件

通常而言消息大小設為1024字節,發送消息前要先發送消息的長度,然后再發消息。接收時也是要先接收長度,再接收消息。
發送文件時要先計算文件的大小,然后發送文件的長度,再發送文件。接收時要先接收文件的大小,socket文件收發緩存大小通常設為65535。注意:文件發送時發送方發送的數據包大小是固定的,但接收方每次收到的數據包大小不固定,每次接收后要用文件長度減去接收到的數據包長度,判斷剩余未接收文件長度小于1才算完成。

stuct模塊pack和unpack缺陷

處理粘包問題我查閱了很多資料,看到絕大多數人都是import struct,使用struct.pack和unpack來完成int數據與bytes相互轉換的工作。但是我覺得struct模塊的pack和unpack有2個缺陷:一是表示數值范圍是-2147483648至2147483647,負值在計算數據長度完全用不上,會造成上傳、下載文件大小不能超過2個G,unpack返回的是一個元組,還要對元組解包才能使用。所以我嘗試自己寫了一個pack和unpack在下面分享給大家。

自定義pack和unpack

def pack(n):if n >= 4294967296 or n < 0:raise ValueError('The value is out of range.')values = ((0b11111111000000000000000000000000, 24),  (0b111111110000000000000000, 16), (0b1111111100000000, 8), (0b11111111, 0))ret = b''for i in values:x = (n & i[0]) >> i[1]x = x.to_bytes(length=1, byteorder="big")ret += xreturn ret
def unpack(numlist):if len(numlist) != 4:raise ValueError("The bytes length must be 4.")values = (24, 16, 8, 0)ret = 0i = 0while i < 4:n = numlist[i]ret += n << values[i]i += 1return ret

代碼說明:
自定義的pack函數表示范圍是0-4294967295,上傳、下載文件長度在4個g以內都不會報錯。
在該函數中通過按位與配合位移算法以及python3內置函數to_bytes()來完成功能,不需要另外import。
自定義的unpack函數直接返回int型數值,不需要解包。在這個函數里全部是自定義的代碼,沒有引用任何函數也沒有導包,通過位移運算完成bytes轉換成int。

到此,關于“python中怎么自定義pack和unpack”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

钟祥市| 壶关县| 项城市| 疏勒县| 阿拉善右旗| 武邑县| 凤山市| 渝中区| 民丰县| 郁南县| 东至县| 呼伦贝尔市| 伊金霍洛旗| 板桥市| 内乡县| 永清县| 博爱县| 五峰| 五大连池市| 屏东市| 牡丹江市| 安宁市| 石景山区| 商城县| 蓬溪县| 仙居县| 那坡县| 盐源县| 永川市| 洱源县| 紫金县| 揭东县| 光泽县| 双鸭山市| 芜湖市| 永安市| 宝应县| 怀来县| 通州区| 余庆县| 金坛市|