91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

措勤县| 阿尔山市| 常宁市| 福州市| 云霄县| 汤阴县| 桑植县| 龙里县| 东明县| 怀远县| 崇信县| 湖北省| 定兴县| 当雄县| 盘山县| 天水市| 周宁县| 渝中区| 郎溪县| 普格县| 南木林县| 吉安市| 万盛区| 宣武区| 九江市| 息烽县| 那曲县| 尼木县| 万州区| 澄城县| 桐梓县| 三台县| 广东省| 漳州市| 神池县| 三门县| 鄂尔多斯市| 广宗县| 赤水市| 连城县| 贵阳市|