最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中的pack和unpack的使用

 更新時(shí)間:2018年03月12日 09:08:04   作者:三月沙  
這篇文章主要介紹了Python中的pack和unpack的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

不同類型的語(yǔ)言支持不同的數(shù)據(jù)類型,比如 Go 有 int32、int64、uint32、uint64 等不同的數(shù)據(jù)類型,這些類型占用的字節(jié)大小不同,而同樣的數(shù)據(jù)類型在其他語(yǔ)言中比如 Python 中,又是完全不同的處理方式,比如 Python 的 int 既可以是有符號(hào)的,也可以是無(wú)符號(hào)的,這樣一來(lái) Python 和 Go 在處理同樣大小的數(shù)字時(shí)存儲(chǔ)方式就有了差異。

除了語(yǔ)言之間的差別,不同的計(jì)算機(jī)硬件存儲(chǔ)數(shù)據(jù)的方式也有很大的差異,有的 32 bit 是一個(gè) word,有的 64 bit 是一個(gè) word,而且他們存儲(chǔ)數(shù)據(jù)的方式或多或少都有些差異。

當(dāng)這些不同的語(yǔ)言以及不同的機(jī)器之間進(jìn)行數(shù)據(jù)交換,比如通過(guò) network 進(jìn)行數(shù)據(jù)交換,他們需要對(duì)彼此發(fā)送和接受的字節(jié)流數(shù)據(jù)進(jìn)行 pack 和 unpack 操作,以便數(shù)據(jù)可以正確的解析和存儲(chǔ)。

計(jì)算機(jī)如何存儲(chǔ)整型

可以把計(jì)算機(jī)的內(nèi)存看做是一個(gè)很大的字節(jié)數(shù)組,一個(gè)字節(jié)包含 8 bit 信息可以表示 0-255 的無(wú)符號(hào)整型,以及 -128—127 的有符號(hào)整型。當(dāng)存儲(chǔ)一個(gè)大于 8 bit 的值到內(nèi)存時(shí),這個(gè)值常常會(huì)被切分成多個(gè) 8 bit 的 segment 存儲(chǔ)在一個(gè)連續(xù)的內(nèi)存空間,一個(gè) segment 一個(gè)字節(jié)。有些處理器會(huì)把高位存儲(chǔ)在內(nèi)存這個(gè)字節(jié)數(shù)組的頭部,把低位存儲(chǔ)在尾部,這種處理方式叫 big-endian ,有些處理器則相反,低位存儲(chǔ)在頭部,高位存儲(chǔ)在尾部,稱之為 little-endian 。

假設(shè)一個(gè)寄存器想要存儲(chǔ) 0x12345678 到內(nèi)存中,big-endian 和 little-endian 分別存儲(chǔ)到內(nèi)存 1000 的地址表示如下

address big-endian little-endian
1000 0x12 0x78
1001 0x34 0x56
1002 0x56 0x34
1003 0x78 0x12

計(jì)算機(jī)如何存儲(chǔ) character

和存儲(chǔ) number 的方式類似,character 通過(guò)一定的編碼格式進(jìn)行編碼比如 unicode,然后以字節(jié)的方式存儲(chǔ)。

Python 中的 struct 模塊

Python 提供了三個(gè)與 pack 和 unpack 相關(guān)的函數(shù)

struct.pack(fmt, v1, v2, ...)
struct.unpack(fmt, string)
struct.calcsize(fmt)

第一個(gè)函數(shù) pack 負(fù)責(zé)將不同的變量打包在一起,成為一個(gè)字節(jié)字符串。

第二個(gè)函數(shù) unpack 將字節(jié)字符串解包成為變量。

第三個(gè)函數(shù) calsize 計(jì)算按照格式 fmt 打包的結(jié)果有多少個(gè)字節(jié)。

pack 操作

Pack 操作必須接受一個(gè) template string 以及需要進(jìn)行 pack 一組數(shù)據(jù),這就意味著 pack 處理操作 定長(zhǎng) 的數(shù)據(jù)

import struct

a = struct.pack("2I3sI", 12, 34, "abc", 56)
b = struct.unpack("2I3sI", a)

print b

上面的代碼將兩個(gè)整數(shù) 12 和 34,一個(gè)字符串 “abc” 和一個(gè)整數(shù) 56 一起打包成為一個(gè)字節(jié)字符流,然后再解包。其中打包格式中明確指出了打包的長(zhǎng)度: "2I" 表明起始是兩個(gè) unsigned int , "3s" 表明長(zhǎng)度為 4 的字符串,最后一個(gè) "I" 表示最后緊跟一個(gè) unsigned int ,所以上面的打印 b 輸出結(jié)果是:(12, 34, ‘a(chǎn)bc', 56),完整的 Python pack 操作支持的數(shù)據(jù)類型見(jiàn)下表。

Format C Type Python type Standard size Notes
x pad byte no value
c char string of length 1 1
b signed char integer 1 (3)
B unsigned char integer 1 (3)
? _Bool bool 1 (1)
h short integer 2 (3)
H unsigned short integer 2 (3)
i int integer 4 (3)
I unsigned int integer 4 (3)
l long integer 4 (3)
L unsigned long integer 4 (3)
q long long integer 8 (2), (3)
Q unsigned long long integer 8 (2), (3)
f float float 4 (4)
d double float 8 (4)
s char[] string
p char[] string
P void * integer (5), (3)

計(jì)算字節(jié)大小

可以利用 calcsize 來(lái)計(jì)算模式 “2I3sI” 占用的字節(jié)數(shù)

print struct.calcsize("2I3sI") # 16

可以看到上面的三個(gè)整型加一個(gè) 3 字符的字符串一共占用了 16 個(gè)字節(jié)。為什么會(huì)是 16 個(gè)字節(jié)呢?不應(yīng)該是 15 個(gè)字節(jié)嗎?1 個(gè) int 4 字節(jié),3 個(gè)字符 3 字節(jié)。但是在 struct 的打包過(guò)程中,根據(jù)特定類型的要求,必須進(jìn)行字節(jié)對(duì)齊(關(guān)于字節(jié)對(duì)齊詳見(jiàn) https://en.wikipedia.org/wiki/Data_structure_alignment) 。由于默認(rèn) unsigned int 型占用四個(gè)字節(jié),因此要在字符串的位置進(jìn)行4字節(jié)對(duì)齊,因此即使是 3 個(gè)字符的字符串也要占用 4 個(gè)字節(jié)。

再看一下不需要字節(jié)對(duì)齊的模式

print struct.calcsize("2Is") # 9

由于單字符出現(xiàn)在兩個(gè)整型之后,不需要進(jìn)行字節(jié)對(duì)齊,所以輸出結(jié)果是 9。

unpack 操作

對(duì)于 unpack 而言,只要 fmt 對(duì)應(yīng)的字節(jié)數(shù)和字節(jié)字符串 string 的字節(jié)數(shù)一致,就可以成功的進(jìn)行解析,否則 unpack 函數(shù)將拋出異常。例如我們也可以使用如下的 fmt 解析出 a :

c = struct.unpack("2I2sI", a)
print struct.calcsize("2I2sI")
print c  # 16 (12, 34, 'ab', 56)

不定長(zhǎng)數(shù)據(jù) pack

如果打包的數(shù)據(jù)長(zhǎng)度未知該如何打包,這樣的打包在網(wǎng)絡(luò)傳輸中非常常見(jiàn)。處理這種不定長(zhǎng)的內(nèi)容的主要思路是把長(zhǎng)度和內(nèi)容一起打包,解包時(shí)首先解析內(nèi)容的長(zhǎng)度,然后再讀取正文。

打包變長(zhǎng)字符串

對(duì)于變長(zhǎng)字符在處理的時(shí)候可以把字符的長(zhǎng)度當(dāng)成數(shù)據(jù)的內(nèi)容一起打包。

s = bytes(s)
data = struct.pack("I%ds" % (len(s),), len(s), s)

上面代碼把字符 s 的長(zhǎng)度打包成內(nèi)容,可以在進(jìn)行內(nèi)容讀取的時(shí)候直接讀取。

解包變長(zhǎng)字符串

int_size = struct.calcsize("I")
(i,), data = struct.unpack("I", data[:int_size]), data[int_size:]

解包變長(zhǎng)字符時(shí)首先解包內(nèi)容的長(zhǎng)度,在根據(jù)內(nèi)容的長(zhǎng)度解包數(shù)據(jù)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python虛擬環(huán)境創(chuàng)建和使用方法(使用自帶的venv模塊)

    Python虛擬環(huán)境創(chuàng)建和使用方法(使用自帶的venv模塊)

    這篇文章主要如何在Python中使用虛擬環(huán)境,包括創(chuàng)建、激活、使用、生成requirements.txt文件、卸載包和刪除虛擬環(huán)境,虛擬環(huán)境有助于隔離項(xiàng)目依賴,避免版本沖突,并便于部署,需要的朋友可以參考下
    2024-12-12
  • python入門(mén)之基礎(chǔ)語(yǔ)法學(xué)習(xí)筆記

    python入門(mén)之基礎(chǔ)語(yǔ)法學(xué)習(xí)筆記

    學(xué)習(xí)python過(guò)程中需要了解的一些基礎(chǔ)語(yǔ)法特整理一下方便更開(kāi)始接觸python的朋友
    2020-02-02
  • python中的extend功能及用法

    python中的extend功能及用法

    Python中的extend()方法用于在列表末尾一次性追加另一個(gè)列表中的多個(gè)值,這篇文章主要介紹了python中的extend功能及用法,需要的朋友可以參考下
    2023-07-07
  • Python實(shí)現(xiàn)定時(shí)自動(dòng)關(guān)閉的tkinter窗口方法

    Python實(shí)現(xiàn)定時(shí)自動(dòng)關(guān)閉的tkinter窗口方法

    今天小編就為大家分享一篇Python實(shí)現(xiàn)定時(shí)自動(dòng)關(guān)閉的tkinter窗口方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • 詳解Python循環(huán)作用域與閉包

    詳解Python循環(huán)作用域與閉包

    這篇文章主要介紹了Python循環(huán)作用域與閉包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Django項(xiàng)目之Elasticsearch搜索引擎的實(shí)例

    Django項(xiàng)目之Elasticsearch搜索引擎的實(shí)例

    今天小編就為大家分享一篇Django項(xiàng)目之Elasticsearch搜索引擎的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • python openpyxl篩選某些列的操作

    python openpyxl篩選某些列的操作

    這篇文章主要介紹了python openpyxl篩選某些列的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Python如何進(jìn)行時(shí)間處理

    Python如何進(jìn)行時(shí)間處理

    這篇文章主要介紹了Python如何進(jìn)行時(shí)間處理,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • Python?pluggy模塊的用法示例演示

    Python?pluggy模塊的用法示例演示

    這篇文章主要介紹了Python?pluggy模塊的用法,pluggy提供了一個(gè)簡(jiǎn)易便捷的插件系統(tǒng),可以做到插件與主題功能松耦合,pluggy?是pytest,tox,devpi的核心框架文中通過(guò)代碼示例演示給大家詳細(xì)介紹,需要的朋友參考下吧
    2022-05-05
  • 詳解Python 協(xié)程的詳細(xì)用法使用和例子

    詳解Python 協(xié)程的詳細(xì)用法使用和例子

    這篇文章主要介紹了詳解Python 協(xié)程的詳細(xì)用法和例子,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06

最新評(píng)論

华亭县| 松桃| 广饶县| 仁布县| 新沂市| 泰和县| 平塘县| 龙山县| 泰顺县| 依安县| 修水县| 新河县| 哈密市| 商南县| 襄樊市| 辽阳市| 米脂县| 鲁山县| 柘城县| 香港 | 界首市| 德清县| 凉山| 长兴县| 岚皋县| 江都市| 和硕县| 乐陵市| 西充县| 沽源县| 政和县| 鹤峰县| 平塘县| 石河子市| 大渡口区| 晋城| 筠连县| 纳雍县| 湟中县| 甘德县| 太谷县|