python 使用 struct 把数据变成字节流
1 struct 的作用:
可以將數據按照指定的格式轉成字節流,
2 struct 里面的函數
2.1 struct.pack(format,?v1,?v2,?...):
返回一個包含值v1、v2、 ... 根據格式字符串format打包的字節對象。參數必須與格式所需的值完全匹配。
2.2 struct.pack_into(format,?buffer,?offset,?v1,?v2,?...):
根據格式字符串format打包值v1?,?v2?, ...并將打包的字節寫入從位置offset開始的可寫緩沖區緩沖區。請注意,偏移量是必需的參數。
2.3 struct.unpack(format,?buffer):
根據格式字符串format從緩沖緩沖區(大概是由 打包)解包。結果是一個元組,即使它只包含一個項目。緩沖區的字節大小必須與格式要求的大小相匹配,如.pack(format,?...)calcsize()
2.4 struct.unpack_from(format,?/,?buffer,?offset=0):
根據格式字符串format,從位置offset開始從緩沖區解包。結果是一個元組,即使它只包含一個項目。從位置offset開始的緩沖區大小(以字節為單位)必須至少是格式所需的大小,如 所反映的那樣。calcsize()
2.5 struct.iter_unpack(format,?buffer):
根據格式字符串format從緩沖區緩沖區中迭代解包。此函數返回一個迭代器,它將從緩沖區讀取相同大小的塊,直到其所有內容都已被消耗。緩沖區的字節大小必須是格式所需大小的倍數,如 所反映的。calcsize()
2.6 struct.calcsize(format):?
?返回與格式字符串format對應的結構體(以及由此產生的字節對象)的大小?。pack(format,?...) 這個是3.4之后的新功能,注意format 不能隨意輸入
字節順序、大小和對齊方式
默認情況下,C 類型以機器的本機格式和字節順序表示,并在必要時通過跳過填充字節來正確對齊(根據 C 編譯器使用的規則)。
或者,可以使用格式字符串的第一個字符來指示打包數據的字節順序、大小和對齊方式,如下表所示:
| Character | Byte order | Size | Alignment | 
|---|---|---|---|
| 
 | native | native | native | 
| 
 | native | standard | none | 
| 
 | little-endian | standard | none | 
| 
 | big-endian | standard | none | 
| 
 | network (= big-endian) | standard | none | 
格式化字符
格式字符有以下含義;考慮到它們的類型,C 和 Python 值之間的轉換應該是顯而易見的。'Standard size'列是指使用標準大小時打包值的大小(以字節為單位);也就是說,當格式字符串中的一個開始'<','>','!'或?'='。使用本機大小時,打包值的大小取決于平臺。
| Format | C Type | Python type | Standard size | Notes | 
|---|---|---|---|---|
| 
 | pad byte | no value | ||
| 
 | 
 | bytes of length 1 | 1 | |
| 
 | 
 | integer | 1 | (1), (2) | 
| 
 | 
 | integer | 1 | (2) | 
| 
 | 
 | bool | 1 | (1) | 
| 
 | 
 | integer | 2 | (2) | 
| 
 | 
 | integer | 2 | (2) | 
| 
 | 
 | integer | 4 | (2) | 
| 
 | 
 | integer | 4 | (2) | 
| 
 | 
 | integer | 4 | (2) | 
| 
 | 
 | integer | 4 | (2) | 
| 
 | 
 | integer | 8 | (2) | 
| 
 | 
 | integer | 8 | (2) | 
| 
 | 
 | integer | (3) | |
| 
 | 
 | integer | (3) | |
| 
 | (6) | float | 2 | (4) | 
| 
 | 
 | float | 4 | (4) | 
| 
 | 
 | float | 8 | (4) | 
| 
 | 
 | bytes | ||
| 
 | 
 | bytes | ||
| 
 | 
 | integer | (5) | 
在 3.3 版更改:添加了對'n'和'N'格式的支持。
在 3.6 版更改:添加了對'e'格式的支持。
Notes:
-  的 '?'轉換碼對應于_Bool由C99定義的類型。如果此類型不可用,則使用char.?在標準模式下,它總是用一個字節表示。
-  當嘗試使用任何整數轉換代碼打包非整數時,如果非整數有一個 __index__()方法,則在打包之前調用該方法將參數轉換為整數。在 3.2 版更改:添加了 __index__()對非整數方法的使用。
-  的 'n'和'N'轉換碼只適用于本機的大小(選擇為默認或與'@'字節順序字符)。對于標準大小,您可以使用適合您的應用程序的任何其他整數格式。
-  對于 'f','d'和'e'轉換碼,填充表示使用IEEE 754 binary32,binary64或binary16格式(?'f','d'或'e'分別地),而不管由所述平臺中使用的浮點格式的。
-  該 'P'格式字符僅適用于本地字節順序(選擇為默認或與'@'字節順序字符)。字節順序字符'='根據主機系統選擇使用小端或大端排序。struct 模塊不會將此解釋為本機排序,因此'P'格式不可用。
-  IEEE 754 binary16“半精度”類型是在IEEE 754 標準的 2008 年修訂版中引入的。它有一個符號位、一個 5 位指數和 11 位精度(顯式存儲 10 位),并且可以表示近似?精度 6.1e-05和6.5e+04全精度之間的數字。C 編譯器并不廣泛支持這種類型:在典型機器上,無符號短整型可用于存儲,但不能用于數學運算。有關更多信息,請參閱有關半精度浮點格式的維基百科頁面。
以上內容參考python 官網教程地址鏈接
基本知識了解完之后開始使用,
demo 說明struct 的使用
demo1 將數字3轉成1個字節流
從上面的字符表格中可以看到轉成1個字節流的是B 和b?
import struct# 把3轉成1個字節
num_a = struct.pack("B", 3)
print(num_a)
print(struct.pack("b", 3))
# 將字符流解包
num_b = struct.unpack("B", num_a)
print(num_b)運行打印的結果如下:
demo2?將數字3轉成2個字節流
從上面的字符表格中可以看到轉成1個字節流的是H和h
import struct# 把3轉成1個字節
num_a = struct.pack("H", 3)
print(num_a)
print(struct.pack("h", 3))
# 將字符流解包
num_b = struct.unpack("H", num_a)
print(num_b)打印結果如下:
demo3 多個數據轉字節流
import struct# 把3轉成1個字節,100轉成2個字節
num_a = struct.pack("BH", 3, 100)
print(num_a)
# 將字符流解包
num_b = struct.unpack("BH", num_a)
print(num_b)
# 查看BH組合占多個字節
print(struct.calcsize('BH'))打印結果如下:
--------------------------------待思考問題-----------------------------
多個字節組合在一起,字節感覺變的沒有規律了,比如1和字節和2個字節組合在一起是4個字節, 目前不知道為啥?
比如
print(struct.pack("BH", 2, 3))
print(struct.calcsize("BH"))打印結果:
這個時候4個字節
修改一下
print(struct.pack("HB", 2, 3))
print(struct.calcsize("HB"))打印結果:
這個時候3個字節,
我是被這個弄暈了,不知道為啥。
總結
以上是生活随笔為你收集整理的python 使用 struct 把数据变成字节流的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 自然之道的作者是谁啊?
- 下一篇: 流量多少钱一M?两千多M能花多少钱?
