日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

python 使用 struct 把数据变成字节流

發布時間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

x

pad byte

no value

c

char

bytes of length 1

1

b

signed?char

integer

1

(1), (2)

B

unsigned?char

integer

1

(2)

?

_Bool

bool

1

(1)

h

short

integer

2

(2)

H

unsigned?short

integer

2

(2)

i

int

integer

4

(2)

I

unsigned?int

integer

4

(2)

l

long

integer

4

(2)

L

unsigned?long

integer

4

(2)

q

long?long

integer

8

(2)

Q

unsigned?long?long

integer

8

(2)

n

ssize_t

integer

(3)

N

size_t

integer

(3)

e

(6)

float

2

(4)

f

float

float

4

(4)

d

double

float

8

(4)

s

char[]

bytes

p

char[]

bytes

P

void?*

integer

(5)

在 3.3 版更改:添加了對'n''N'格式的支持。

在 3.6 版更改:添加了對'e'格式的支持。

Notes

  1. '?'轉換碼對應于_Bool由C99定義的類型。如果此類型不可用,則使用char.?在標準模式下,它總是用一個字節表示。

  2. 當嘗試使用任何整數轉換代碼打包非整數時,如果非整數有一個__index__()方法,則在打包之前調用該方法將參數轉換為整數。

    在 3.2 版更改:添加了__index__()對非整數方法的使用。

  3. 'n''N'轉換碼只適用于本機的大小(選擇為默認或與'@'字節順序字符)。對于標準大小,您可以使用適合您的應用程序的任何其他整數格式。

  4. 對于'f''d''e'轉換碼,填充表示使用IEEE 754 binary32,binary64或binary16格式(?'f''d''e'分別地),而不管由所述平臺中使用的浮點格式的。

  5. 'P'格式字符僅適用于本地字節順序(選擇為默認或與'@'字節順序字符)。字節順序字符'='根據主機系統選擇使用小端或大端排序。struct 模塊不會將此解釋為本機排序,因此'P'格式不可用。

  6. IEEE 754 binary16“半精度”類型是在IEEE 754 標準的 2008 年修訂版中引入的。它有一個符號位、一個 5 位指數和 11 位精度(顯式存儲 10 位),并且可以表示近似?精度6.1e-056.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 把数据变成字节流的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。