python 二進制流_Python中對字節流/二進制流的操作:struct模塊簡易使用教程

前言

前段時間使用Python解析IDX文件格式的MNIST數據集,需要對二進制文件進行讀取操作,其中我使用的是struct模塊。查了網上挺多教程都寫的挺好的,不過對新手不是很友好,所以我重新整理了一些筆記以供快速上手。

注:教程中以下四個名詞同義:二進制流、二進制數組、字節流、字節數組

快速上手

在struct模塊中,將一個整型數字、浮點型數字或字符流(字符數組)轉換為字節流(字節數組)時,需要使用格式化字符串fmt告訴struct模塊被轉換的對象是什么類型,比如整型數字是'i',浮點型數字是'f',一個ascii碼字符是's'。

def demo1():

# 使用bin_buf = struct.pack(fmt, buf)將buf為二進制數組bin_buf

# 使用buf = struct.unpack(fmt, bin_buf)將bin_buf二進制數組反轉換回buf

# 整型數 -> 二進制流

buf1 = 256

bin_buf1 = struct.pack('i', buf1) # 'i'代表'integer'

ret1 = struct.unpack('i', bin_buf1)

print bin_buf1, ' <====> ', ret1

# 浮點數 -> 二進制流

buf2 = 3.1415

bin_buf2 = struct.pack('d', buf2) # 'd'代表'double'

ret2 = struct.unpack('d', bin_buf2)

print bin_buf2, ' <====> ', ret2

# 字符串 -> 二進制流

buf3 = 'Hello World'

bin_buf3 = struct.pack('11s', buf3) # '11s'代表長度為11的'string'字符數組

ret3 = struct.unpack('11s', bin_buf3)

print bin_buf3, ' <====> ', ret3

# 結構體 -> 二進制流

# 假設有一個結構體

# struct header {

# int buf1;

# double buf2;

# char buf3[11];

# }

bin_buf_all = struct.pack('id11s', buf1, buf2, buf3)

ret_all = struct.unpack('id11s', bin_buf_all)

print bin_buf_all, ' <====> ', ret_all

輸出結果如下:

demo1輸出結果

詳解struct模塊

主要函數

struct模塊中最重要的三個函數是pack(), unpack(), calcsize()

# 按照給定的格式化字符串,把數據封裝成字符串(實際上是類似于c結構體的字節流)

string = struct.pack(fmt, v1, v2, ...)

# 按照給定的格式(fmt)解析字節流string,返回解析出來的tuple

tuple = unpack(fmt, string)

# 計算給定的格式(fmt)占用多少字節的內存

offset = calcsize(fmt)

struct中的格式化字符串

struct中支持的格式如下表:

Format

C Type

Python

字節數

x

pad byte

no value

1

c

char

string of length 1

1

b

signed char

integer

1

B

unsigned char

integer

1

?

_Bool

bool

1

h

short

integer

2

H

unsigned short

integer

2

i

int

integer

4

I

unsigned int

integer or lon

4

l

long

integer

4

L

unsigned long

long

4

q

long long

long

8

Q

unsigned long long

long

8

f

float

float

4

d

double

float

8

s

char[]

string

1

p

char[]

string

1

P

void *

long

注1:q和Q只在機器支持64位操作時有意思

注2:每個格式前可以有一個數字,表示個數

注3:s格式表示一定長度的字符串,4s表示長度為4的字符串,但是p表示的是pascal字符串

注4:P用來轉換一個指針,其長度和機器字長相關

注5:最后一個可以用來表示指針類型的,占4個字節

為了同c中的結構體交換數據,還要考慮有的c或c++編譯器使用了字節對齊,通常是以4個字節為單位的32位系統,故而struct根據本地機器字節順序轉換.可以用格式中的第一個字符來改變對齊方式.定義如下:

Character

Byte order

Size and alignment

@

native

native 湊夠4個字節

=

native

standard 按原字節數

<

little-endian

standard 按原字節數

>

big-endian

standard 按原字節數

!

network (= big-endian)

standard 按原字節數

使用方法是放在fmt的第一個位置,就像'@5s6sif'

參考

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533634.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533634.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533634.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

react 圖片放在src里面還是public_手寫Webpack從0編譯Vue/React項目

當前前端開發&#xff0c;90%的項目都是Vue和React&#xff0c;然而70%的同學都基于腳手架創建項目&#xff0c;因為腳手架會包含項目基本框架、webpack配置、scss/sass/less解析、babel配置、DevServer、JSX/Vue文件解析、CSS前綴等&#xff0c;我們要做的就是開發功能模塊&am…

python union函數_如何掌握Python union()方法及怎么用?

不斷學習python的過程里&#xff0c;總能遇到各種形形色色的函數或者方法&#xff0c;本章給大家帶來python union的用法&#xff0c;具體內容如下&#xff1a;union()方法描述&#xff1a;union() 取并集&#xff0c;效果等同于 | &#xff0c;重復元素只會出現一次&#xff0…

輸入分鐘輸出小時python_輸出鍵,值對如何使1小時內的時間在使用Python的MapReduce中的reducer中結束?...

這是一個策略&#xff1a;來自Mapper的&#xff1a;發出每個記錄的三個副本并使用二級排序&#xff1a;((復合鍵)&#xff0c;值)((消息小時 - 一小時&#xff0c;當前消息的精確時間)&#xff0c;消息)((消息小時&#xff0c;消息的準確時間)&#xff0c;消息)((消息小時1小時…

python 在線預覽文件_用Python PyQt寫一個在線預覽圖片的GUI

在爬完網上一篇帖子&#xff0c;并得到其中的所有圖片鏈接后&#xff0c;寫一個GUI來實現在線預覽是一個很自然的想法&#xff0c; 相當于實現一個python版的圖片瀏覽器&#xff0c; 通過這個練習&#xff0c;可以讓我們更熟悉PyQt這個庫。這里我用的是PyQt4。以下是我的寫的程…

python怎樣安裝模塊_python中如何安裝模塊

下面介紹幾種安裝Python模塊的幾種方式方法1&#xff1a;easy_install 方式先下載ez_setup.py,運行python ez_setup 進行easy_install工具的安裝&#xff0c;之后就可以使用easy_install進行安裝package了。本文安裝的是Python 2.7.13版本&#xff0c;已經自帶了easy_install。…

java rt_java中rt包中源碼了解

javap –verbose class名 查看class文件的具體內容javap -c class名繼續看io類接口 java.io.Closeable功能&#xff1a;關閉流和相應的資源java.io.console功能&#xff1a;使用字節控制臺&#xff0c;與當前的java virtual machine 相關java.io.DataInput功能&#xff1a;從二…

google 確定某點海拔高_一份“高投資回報率”的用戶體驗度量方法指南

本文核心就是介紹體驗度量方法&#xff0c;以及如何在商業項目中如何發起一個具有高ROI(投資回報率)的用戶體驗量化流程。 下面文章將分為解讀高投資回報和拆解體驗度量、實際案例講解三部分。一、解讀高投資回報率高ROI(投資回報率)來定義體驗度量流程的原因&#xff1f;3-5年…

md5 java代碼_JAVA簡單實現MD5注冊登錄加密實例代碼

開發環境&#xff1a;jdk1.7&#xff0c;eclipse框架&#xff1a;springmvc&#xff0c;mybatis工具&#xff1a;maven以下代碼復制即可實現MD5加密創建一個mave項目&#xff0c;加web。不懂得可以搜索一下就有了。注冊用戶的JSP頁面代碼如下。pageEncoding"utf-8"%&…

一維卷積神經網絡_序列特征的處理方法之二:基于卷積神經網絡方法

前言上一篇文章介紹了基本的基于注意力機制方法對序列特征的處理&#xff0c;這篇主要介紹一下基本的基于卷積神經網絡方法對序列特征的處理&#xff0c;也就是TextCNN方法。序列特征的介紹&#xff0c;背景以及應用可以參考上一篇的詳細介紹&#xff0c;這里簡單回顧一下定義&…

java socket 阻塞模式_(四) 如何將socket設置為非阻塞模式

1. windows平臺上無論利用socket()函數還是WSASocket()函數創建的socket都是阻塞模式的&#xff1a;SOCKET WSAAPI socket( _In_ int af, _In_ int type, _In_ int protocol ); SOCKET WSASocket( _In_ int af, _In_ int t…

python中的pygame模塊使用方法_Pygame的基本使用

Pygame有很多模塊&#xff0c;每個模塊又有很多方法&#xff0c;在此不能夠逐一講解&#xff0c;所以&#xff0c;我們通過一個實例來學習Pygame&#xff0c;然后再分解代碼&#xff0c;講解代碼中的模塊。例&#xff1a;制作一個跳躍的小球游戲。創建一個游戲窗口&#xff0c;…

java mongodb 插入數據_mongoDB 插入數據 用java實現

import java.net.UnknownHostException;import com.mongodb.BasicDBObject;import com.mongodb.DB;import com.mongodb.DBCollection;import com.mongodb.DBObject;import com.mongodb.Mongo;/** *用java 往mongoDB插入數據 * author wwd* */public class InsertData {publi…

python的特征提取實驗一_Spark 2.1.0 入門:特征抽取 — TF-IDF(Python版)

這一部分我們主要介紹和特征處理相關的算法&#xff0c;大體分為以下三類&#xff1a;特征抽取&#xff1a;從原始數據中抽取特征特征轉換&#xff1a;特征的維度、特征的轉化、特征的修改特征選取&#xff1a;從大規模特征集中選取一個子集特征提取TF-IDF (HashingTF and IDF)…

java addlast_Java中的LinkedList addLast()方法: java.util.LinkedList.addLast() - Break易站

Java中的java.util.LinkedList.addLast()方法用于在LinkedList的末尾插入特定元素。句法&#xff1a;void addLast(Object element)參數&#xff1a;此函數接受單個參數元素&#xff0c;如上面的語法所示。此參數指定的元素將附加在列表的末尾。返回值&#xff1a;此方法不返回…

macos降級_iOS12.3 beta2更新了什么 iOS12.3測試版2新特性與升降級方法

4月0日凌晨&#xff0c;蘋果發布了iOS12.3 beta2&#xff0c;作為iOS12.3第二個測試版&#xff0c;相比前一個版本&#xff0c;發布時間間隔近2周&#xff0c;這次依然是小版本更新&#xff0c;不過相對良心一些&#xff0c;主要是多了一些與國內用戶相關的東西。iOS12.3 beta …

java技術教程視頻_Spring開發視頻教程高級篇+源碼(400M)33講

Spring開發視頻教程高級篇源碼(400M)33講01_全面闡釋Spring及其各項功能.rar 02_搭建與測試Spring的開發環境.rar 03_編碼剖析Spring管理Bean的原理.rar 04_Spring的三種實例化Bean的方式.rar 05_配置Spring管理的bean的作用域.rar 06_Spring管理的Bean的生命周期.rar 07_編碼剖…

python的常見矩陣除法_Numpy矩陣除法返回所有零

我對下面的矩陣有個除法錯誤。我想用行和的101向量除以1010matrix。在[[5731, 3, 20, 8, 12, 54, 46, 8, 39, 2],[ 2, 6472, 47, 24, 7, 44, 7, 11, 116, 12],[ 55, 36, 5296, 104, 84, 27, 106, 53, 183, 14],[ 50, 49, 132, 5312, 2, 253, 36, 58, 142, 97],[ 16, 28, 36, 9,…

java rc2加密_急求java RC2加密算法

下面是一段C RC2加密 要求要用java 重寫 能互相加密解密QSBEncryptRc2::QSBEncryptRc2(){EncryKey "DingXin Communication Key 20080613";}//解密失敗時返回失敗描述AnsiString QSBEncryptRc2::GetDecryptErrMsg(){int ErrorCode;AnsiString ErrMsg;ErrorCode …

linux配置usb主從_雜集:淺談關于Mongodb數據庫主從復制

Linux下Mongodb數據庫主從復制配置Mongodb的三種集群搭建的方式&#xff1a;Master-Slaver&#xff1a;主從[目前被副本集取代]。Replica Set&#xff1a;副本集。Sharding&#xff1a;切片。Mongodb單實例缺點&#xff1a;適合簡易開發時使用&#xff0c;生產使用不行&#xf…

java讀取郵箱附件_使用javamail獲取附件內容

我正在使用javamail來自動化一些電子郵件處理。使用javamail獲取附件內容我設法連接到pop3服務器并獲取消息。其中一些包含附件。根據郵件標題&#xff0c;我可以“預測”我需要獲取的附件的文件名。但我無法得到它的內容:(我有一個函數public byte[] searchForContent(Part pa…