1. 程式人生 > >菜鳥學堂 -【Python struct】

菜鳥學堂 -【Python struct】

本來想用python socket傳輸檔案,結果悲劇發生,那麼你懂的

struct

由於沒有c語言基礎,而且E文..,看官方文件,這個部分看的很蛋疼,果斷百度。

struct.pack(fmtv1v2...)

Return a bytes object containing the values v1v2, ... packed according to the format string fmt. The arguments must match the values required by the format exactly.

    返回一個位元組物件,包含了v1,v2等,通過fmt格式化後的資料。引數必須和fmt需要格式化的完全對應起來。
struct.unpack(fmtbuffer)

Unpack from the buffer buffer (presumably packed by pack(fmt, ...)) according to the format string fmt. The result is a tuple even if it contains exactly one item. The buffer must contain exactly the amount of data required by the format (len(bytes) must equal calcsize(fmt)

).

pack的逆向操作,只有一個物件也返回tuple。

struct.calcsize(fmt)

Return the size of the struct (and hence of the bytes object produced by pack(fmt, ...)) corresponding to the format string fmt.

          根據fmt的格式,返回需要的位元組大小

通俗解釋:

pack(fmt, v1, v2, ...)     按照給定的格式(fmt),把資料封裝成字串(實際上是類似於c結構體的位元組流)

unpack(fmt, string)       按照給定的格式(fmt)解析位元組流string,返回解析出來的tuple

calcsize(fmt)                 計算給定的格式(fmt)佔用多少位元組的記憶體


'''
Created on 2012-4-12下午9:40:49

@author: yasenagat
@email:   [email protected]


'''
#--看了看,方法很少,重點就兩個pack,unpack,還有一個calcsize

#這個官方文件不好的地方,我感覺就是返回值太蛋疼,看半天E問才能看見,到底是什麼型別的返回值,非常不直觀。
#E文吃力的,直接飄過吧

from struct import *

#一、
#先說說要做什麼吧
#我要把1這個數字,按照我自己定的規則打包,然後在解包

#規則
fmt = 'i'
#壓縮包
a = pack(fmt,1)
print(a)# 壓包後 b'\x01\x00\x00\x00'

#解壓縮包
b = unpack(fmt,a)
print(b)# 解包後 (1,)

#用錯誤的規則解包,報錯!!!
#b = unpack('s',a)
print(b)
#struct.error: unpack requires a bytes object of length 1
#需要一個長度為1的位元組陣列物件

#那麼為什麼是1呢?
length = calcsize('s')
print(length)
#原來錯誤的fmt需要的長度是1
#看看爭取的需要長度是多少呢
print(calcsize(fmt))# 4,正確的需要長度是4


#二、
#壓包多個數據

#是這樣的,fmt這個是後寫的,你只有只要要壓縮的資料型別,才能知道你的fmt
a = pack('4s2sif2s',b'abcd',b'gg',1,23.98,b'hi')
print(a)  # b'abcdgg\x00\x00\x01\x00\x00\x00\n\xd7\xbfAhi'

a = pack('1s2sif2s',b'abcd',b'gg',1,23.98,b'hi')
print(a) # b'agg\x00\x01\x00\x00\x00\n\xd7\xbfAhi'

a = pack('5s2sid2s',b'abcd',b'gg',1,23.98,b'hi')
print(a) # b'abcd\x00gg\x00\x01\x00\x00\x00\x00\x00\x00\x00{\x14\xaeG\xe1\[email protected]'

b = unpack('5s2sid2s',a)
print(b) # (b'abcd\x00', b'gg', 1, 23.98, b'hi')

#如果你能看懂,那麼你很給力,反正我開始是沒看懂

#看懂的略過,沒看懂的往下看

#a = pack('4s2sif2s',b'abcd',b'gg',1,23.98,b'hi')#print(a)  # b'abcdgg\x00\x00\x01\x00\x00\x00\n\xd7\xbfAhi'#pack(fmt,v1,v2...)#v1,v2支援的格式入下:


你找破頭,發現都沒找到字串這個東西,那麼呵呵,如果你想搞字串,只能選擇這個bytes了

所以,b'abcd',要加一個b。

('4s2sif2s',b'abcd',b'gg',1,23.98,b'hi'),

4s2sif2s是fmt,後面的都是value值,4s是4個s,s=bytes(見上面),所以4s對應的是b'abcd',如果你寫成3s,那麼,會少取一個,寫成5s,自己看吧,試試,如果沒寫,那。。。。

i=integer對應1,

f=float對應23.98,用f有點小問題,應該用d。

這會你懂了嗎?

fmt亂寫會報錯的呀

a = pack('3i',b'abcd',b'gg',1,23.98,b'hi')
你看看報錯不!

3i是說有3個i,i是integer,就是有3個integer,明顯是錯的。

對的,請看下面:

a = pack('4s2sid2s',b'abcd',b'gg',1,23.98,b'hi')
#解壓如下:
#一:
b = unpack('4s2sid2s',a)
print(b)
print(str(b[0],'utf-8'))

#二:
b1,b2,b3,b4,b5 = unpack('4s2sid2s',a)
print(str(b1,'utf-8'))
print(b4)
哪個更好點呢?


注意:二進位制檔案處理時會碰到的問題

我們使用處理二進位制檔案時,需要用如下方法

binfile=open(filepath,'rb')    讀二進位制檔案

binfile=open(filepath,'wb')    寫二進位制檔案

那麼和binfile=open(filepath,'r')的結果到底有何不同呢?

不同之處有兩個地方:

第一,使用'r'的時候如果碰到'0x1A',就會視為檔案結束,這就是EOF。使用'rb'則不存在這個問題。即,如果你用二進位制寫入再用文字讀出的話,如果其中存在'0X1A',就只會讀出檔案的一部分。使用'rb'的時候會一直讀到檔案末尾。

第二,對於字串x='abc\ndef',我們可用len(x)得到它的長度為7,\n我們稱之為換行符,實際上是'0X0A'。當我們用'w'即文字方式寫的時候,在windows平臺上會自動將'0X0A'變成兩個字元'0X0D','0X0A',即檔案長度實際上變成8.。當用'r'文字方式讀取時,又自動的轉換成原來的換行符。如果換成'wb'二進位制方式來寫的話,則會保持一個字元不變,讀取時也是原樣讀取。所以如果用文字方式寫入,用二進位制方式讀取的話,就要考慮這多出的一個位元組了。'0X0D'又稱回車符。linux下不會變。因為linux只使用'0X0A'來表示換行。




相關推薦

學堂 -Python struct

本來想用python socket傳輸檔案,結果悲劇發生,那麼你懂的 struct 由於沒有c語言基礎,而且E文..,看官方文件,這個部分看的很蛋疼,果斷百度。 struct.pack(fmt, v1, v2, ...) Return a bytes objec

也瘋狂UML系列——淺析UML四種關系

顏色 雙向關聯 直線 不同的 .net 人的 學習 系列 主類 在UML中。關系是很重要的。它抽象出對象之間的聯系,讓對象構成某個聯系起來的結構。以下將簡要分析一下UML中的四種關系:關聯。依賴,泛化,實現。 一、舉例羅列

入門ASP.NET Core3:準備CentOS和Nginx環境

sysconf service www post 輸入密碼 mct cnblogs kdt 提示 基本軟件 VMware虛擬機 centos:http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_

入門ASP.NET Core5:命令行配置、Json文件配置、Bind讀取配置到C#實例、在Core Mvc中使用Options

加載 中間 view tar public png 配置到 index 不同 命令行配置 我們通過vs2017創建一個控制臺項目CommandLineSample 可以看到現在項目以來的是dotnet core framework 我們需要吧a

java 自動化實踐之二採用POI將圖片存入指定的excel單元格中(支援excel2003和2007)

實現目的:selenium實時擷取瀏覽器圖,並採用POI將圖片存入指定的excel單元格中(支援excel2003和2007) package common; import org.apache.log4j.Logger; import org.apache.poi.hs

java 自動化實踐之四將資料庫查詢資料,轉為TestNG適用的物件二維陣列資料

資料庫資料:資料庫操作:import java.sql.*; import org.apache.log4j.Logger; public class MysqlConn { private static Logger log = Logger.getLogger(My

也瘋狂UML系列——淺析UML四種關係

    在UML中,關係是非常重要的,它抽象出物件之間的聯絡,讓物件構成某個聯絡起來的結構。下面將簡要分析一下UML中的四種關係:關聯,依賴,泛化,實現。 一、舉例羅列     1、關聯(Asso

python自制讓大白成為你的個人助手!

article get content clas tps com class out 自制 我做這個軟件就是要讓賣萌進行究竟! 官方站點:http://www.jackeriss.com/companions.htm GitHub:https://github.co

Python學習Python解決漢諾塔問題

次數 代碼 int 解題思路 move python學習 求解 color 印度 參考文章:http://www.cnblogs.com/dmego/p/5965835.html 一句話:學程序不是目的,理解就好;寫代碼也不是必然,省事最好;拿也好,查也好,解決問題就好

Python筆記文件常見用法

off 習慣 size readline 追加 run 寫到 文件 內部 關於文件的函數w 寫方式a 追加模式打開(從EOF開始,必要時創建新文件)r+ 以讀寫模式打開w+ 以讀寫模式打開a+ 以讀寫模式打開rb 以二進制讀模式打開wb 以二進制寫模式打開 (參見 w )a

python學習使用python寫一個2048小遊戲

ast stc 遊戲 多少 wan nbsp 小遊戲 效果 參考 個人博客:jerwang.cn 沒有參考其他代碼,效果圖: 話不多少,源代碼: https://github.com/jerustc/Python/blob/master/2048.py【python學

Python學習Python中的數據類型精度問題

類型 一次 /usr logs int 第一次 pytho 整數 問題 Python真的很神奇。。。神奇到沒有直接的數據類型概念,並且精度可以是任意精度。想當初,第一次接觸OI算法時,寫得第一個算法就是高精度加法,搗鼓了半天。一切在Python看來,僅僅三行代碼即可完成。

python Dict python 字典操作

div 調用 clear 時報 bsp 找到 ict strong 數字 python字典 是一個無序、以鍵值對存儲的數據類型,數據關聯性強、唯一一個映射數據類型。鍵:必須是可哈希(不可變的數據類型:字符串、數字、元組、bool)值,並且是唯一的 None: none 是一

python學習今天看看學習 %d ,%s, %f 等用法,下面的學習例子是說輸入名字、年齡、工作,工資。並給出65歲退休還差多久的計算

msg ear end style 資料 科學 一個 保留 value 今天看看學習 %d ,%s, %f 等用法。%d 是占位符整數,%s 是占位符,%f 是浮點數。下面的學習例子是說輸入名字、年齡、工作,工資。並給出65歲退休還差多久的計算。重點在於用占位符來print

python-excelSelenium+python自動化之讀取Excel數據(xlrd)

logs title .html selenium2 ref target targe pos 數據 Selenium2+python自動化之讀取Excel數據(xlrd) 轉載地址:http://www.cnblogs.com/lingzeng86/p/6793398.h

python-字典判斷python字典中key是否存在的

打印 是否 str pop highlight int rac copyto 屬性 一般有兩種通用做法: 第一種方法:使用自帶函數實現: 在python的字典的屬性方法裏面有一個has_key()方法: [python] view plain copy #生成一

python-inipython讀寫ini文件

clas edr print 代碼 cells order sta read param 【python-ini】python讀寫ini文件 本文實例講述了Python讀寫ini文件的方法。分享給大家供大家參考。具體如下: 比如有一個文件update.ini,裏面有這些

python-stripPython strip()方法

python this 指定 round str ret amp rip int strip()方法用於移除字符串首尾的指定字符(默認是空格) 比如: str = "0000000this is string example....wow!!!0000000"; print

Python初學者合並(拼接)字符串

Python【Python初學者】合並(拼接)字符串

Python初學者使用方法修改字符串的大小寫

Python【Python初學者】使用方法修改字符串的大小寫