Skip to main content

Python-pack_unpack

· 3 min read

pack & unpack

根據特定的格式來讀取或封裝資料。

格式部份分成兩個部份

byte-order: 這邊可以決定採用big-endian 或是 little endian, 如果沒有給的話,預設是採用系統的方式去做,那這邊比較要注意到的是 以前再寫C語言的時候,都會有所謂的htons...類的轉換,在這邊可以使用'!' 這個符號來解決這個問題,他會自己使用network的Byte order rule去解讀資料,所以有在用網路連線傳資料的話,一定要用! 避免資料解讀錯誤的問題。

format-characters:

常用的有

  • x:pad byte,就忽略他
  • h:short,2 Byte
  • s:char[], 代表字串,使用時前面要加上數字
  • i:long int, 4Byte
  • B:unsigned char, 1 Byte

詳細的格式資訊請參考官網 Python struct

這邊來個簡單範例 假設今天我們撰寫屬於自己的網路遊戲 然後我們玩家每次上線時,SERVER都會傳送一份玩家的資料給Client

這份資料包含了

  • 遊戲版本
  • 玩家ID
  • 玩家的座標(XY)
  • 玩家當前的財產
  • 玩家的職業
  • 玩家的等級
  • 玩家的經驗值

每個資料所需要的型態跟大小如下敘述

Myheader(){
uint8:version
uint8:playerID
uint16:x
uint16:y
uint32:momey
char10:profession
uint8:level
uint32:experience
}

所以傳送資料過來的時候,我們必須要謹慎的按照這個規格去放置我們的資料。

Example

假設

  • version = 1
  • playerID = 56
  • x = 123
  • y = 2341
  • momey = 5566217
  • profession = "warrior"
  • level = 128
  • experience = 2147383611
data = pack('2B2HI10sBI',version,playerID,x,y,momey,profession,level,experience)
//'\x018{\x00%\t\x00\x00\t\xefT\x00warrior\x00\x00\x00\x80\x00\xdb\xff\xff\x7f'
unpack('2B2HI10sBI',data)
(1, 56, 123, 2341, 5566217, 'warrior\x00\x00\x00', 128, 2147483611)