2024-07-19|閱讀時間 ‧ 約 24 分鐘

【💊 Python的解憂錦囊】使用struct把資料打包成bytes的方法

raw-image


我們在學習kafka的過程中最不習慣的就是不管什麼樣的資料, 在kafka的傳輸過程都會是binary的資料格式, 因此我們在撰寫程式的過程中並不是那麼的直觀, 必須將資料從float、int…資料型態轉型成binary才能順利傳送, 那麼基於這樣的前提之下, python這套程式語言可以怎麼做呢?


如果您還不知道kafka是什麼? 歡迎加入「🔒 阿Han的軟體心法實戰營 - kafka專區」一起學習, 讓您的系統架構更為即時, 而這個篇章正是您在kafka的程式撰寫之中會使用到的一個環節。


struct模組主要有哪些功能?

  • 打包(Packing):將 Python 變量轉換為二進制數據表示形式。
  • 解包(Unpacking):將二進制數據轉換回 Python 變量。
  • 計算大小(calcsize)


常用的格式字元與對應數據

這張表在底下的範例中會常常出現的符號, 至於對應的資料型態是什麼就可以回來看看這張表做為一個對應。


怎麼用?

打包數據

將變數打包成binary, if代表整數跟浮點數

import struct

# 打包一個有符號整數 (i) 和一個浮點數 (f)
data = struct.pack('if', 42, 3.14)

# 打印結果為二進制數據
print(data)



解包數據

將binary解包成變數,if代表整數跟浮點數

import struct

# 解包先前打包的數據
data = struct.pack('if', 42, 3.14)
result = struct.unpack('if', data)

# 打印解包後的結果
print(result) # 輸出 (42, 3.140000104904175)



當我們將資料送到kafka時…

# 對標頭裡的欄位進行編碼
headers = {
'ratio': struct.pack('f', 0.14159),
}
# 生產訊息到kafka
producer.produce(
topic='xxx',
value='xxx',
headers=headers,
)

# === [producer] => [kafka] => [consumer] ======
# 消費者拉訊息
msg = consumer.poll(1.0)
headers = msg.headers()
headers = {x[0]: x[1] for x in headers}
ratio = struct.unpack('f', headers['ratio'])[0]
print(ratio)

結語

內建於Python模組, 怎麼能不好好運用呢? struct模組在進行二進制資料格式的時候非常有用, 讓我們一起學起來用用看吧!

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.