struct 封裝變長字串

2021-08-08 12:27:52 字數 2576 閱讀 6924

使用struct,可以非常方便的處理二進位制資料,將常用的int,string等型別的資料轉成二進位制資料,它有兩個重要函式,乙個是pack,乙個是unpack

先看一張表

struct中支援的格式如下表:

format

c type

python

位元組數x

pad byte

no value1c

char

string of length 11b

signed

char

integer1b

unsigned

char

integer1?

_bool

bool1h

short

integer2h

unsigned

short

integer2i

intinteger4i

unsigned

intinteger or long4l

long

integer4l

unsigned

long

long4q

long

long

long8q

unsigned

long

long

long8f

float

float4d

double

float8s

char

string1p

char

string1p

void

*

def demo():  

string = struct.pack('ii4s',3,4,'test')

a1,a2,a3 = struct.unpack('ii4s',string)

print a1,a2,a3

這個小小的例子,已經把struct的功能完美的詮釋了,對照著上面的圖表,我們可以將任何型別的資料轉換成二進位制資料

但是有兩點還是要強調說明一下:

(1) pack 返回的是字串

(2) unpack返回的是tuple

在實際應用中,我們可以用其將資料儲存到二進位制檔案中,比如個人資訊:name,age,address

我們將乙個人的個人資訊轉成二進位制資料儲存到乙個二進位制檔案中,然後在需要的時候將其取出。現在好好思考一下這個問題,假設有一百條個人資訊,每條個人資訊都包含name,age,address,我們需要將他們寫入到二進位制檔案中,但是得確保他們乙個挨著乙個,而且轉化後的二進位制資料應該是等長的,這樣讀取的時候才能逐條的讀取個人資訊。age是年齡,可以用乙個int來表示,乙個int佔4個byte,但name和address都不是定長的,所以需要給他們乙個固定的長度,為了簡單,我們要求name的長度最大為10byte,address的最大長度為60byte。這樣,乙個人的個人資訊就可以用74byte來表示。pack的第乙個引數可以這樣來寫『i10s60s』。

這樣子寫是沒有問題的,但是讀的時候就有麻煩了,我們為name分配了10個byte,但可能最終只用了6個byte或9個byte來儲存name的二進位制資料,讀取時,使用unpack,得到的是10個byte組成的字串,這樣一來就不清楚name的真實值是什麼。

現在,需要一種可以封裝變長string的方法。為name分配15個byte,前4個byte用來記錄name的長度,剩下的11個byte用來儲存name的二進位制資料

設計兩個函式,乙個用來封裝變長string,乙個用來解封string

#coding=utf-8  

'''''

created on 2017-9-20

@author: jacky.zhou

'''

import struct

block = 15

def struct_str(string):

length = len(string)

if length>block-4:

return false,none

length_str = struct.pack('i',length)

new_str = length_str+string

str_pack = struct.pack(str(block)+'s',new_str)

return true,str_pack

def get_struct_str(string):

length = struct.unpack('i',string[0:4])[0]

str_content = struct.unpack('s'.format(length=length),string[4:4+length])[0]

print str_content

if __name__ == '__main__':

state,str = struct_str('非常好')

get_struct_str(str)

注意,傳入的string是『非常好』 ,如果傳入u'非常好' 是會報錯的,因為pack要求傳入字串

可變長字串

目錄stringbuilder 其他可變長字串,jdk1.0提供,執行效率慢,執行緒安全字串緩衝區 執行緒安全的可變字串 字串行 字串 如果字串需要頻繁修改,可用stringbuffer構造方法stringbuffer 初始容量為16個字元 stringbuffer int capacity 構造乙...

變長字串的記憶體管理

方法1 靜態記憶體 這裡有乙個方法來實現幫助函式 const char get string 複製 這個方法的好處是比較簡單,但是它也有很多嚴重的缺點。返回的字串可能比你期望的要長。無論你指定buf什麼樣的長度,它仍然可能太小。如果實際的字串太長,你或者超出陣列的範圍最終導致 悲慘的失敗,或者必須擅...

ORACLE in 字串,字串,字串

因為傳進來的引數是 字串,字串,字串,要實現in 字串,字串,字串 select from htl price p where p.hotel id 30073328 and p.able sale date between to date 2009 03 27 yyyy mm dd and to ...