理解struct模块
- struct用于把数据结构与二进制交互,打包或解析
在c++里的struct的数据体
struct Preson{
int age;
string name;
}preson;
int main(){
//preson=new Preson{};
preson.age=18;
preson.name='zzz';
cout<<preson<<endl;
return 0
}
二进制与十六进制转换
- binascii提供进制转换方法
binascii.hexlify(b)
:返回十六进制
binascii.unhexlify(hexfy)
:返回二进制
字符串,二进制转换
string='abc'
# 字符串打包为二进制
bstr=bytes(string,encoding='ascii')
print('bytes:',bstr)
# 解析二进制为字符串
print(bstr.decode('ascii'))
int,二进制转换
- to_bytes()
- from_bytes()
num=-660
# int打包为2进制
bnum=num.to_bytes(4,byteorder='little',signed=True)
print('to_bytes:',bnum)
# 解析2进制int
print(int.from_bytes(bnum,byteorder='little', signed=True))
纯数字结构体,二进制转换
import struct
values=(-660,25,33)
sct=struct.Struct('iii')
# 打包为2进制数据
bvalues=sct.pack(*values)
print(bvalues)
# 解析2进制数据
print(sct.unpack(bvalues))
struct,内存节省
import struct
import binascii
import ctypes
# 设置参数
sou_val= (1,2.7,'abc')
str_val=[i if isinstance(i,str) else str(i) for i in sou_val]
bt_val=[bytes(i,'utf-8') for i in str_val]
tpe_str=''.join(['%ss'%len(i) for i in bt_val])
# 构造结构体
sct=struct.Struct(tpe_str)
# 新建内存空间,buf也是二进制
buf=ctypes.create_string_buffer(sct.size) #二进制
# 二进制入内存
sct.pack_into(buf,0,*bt_val)
# 二进制写出文件
fle2=buf
print(len(fle2))
# 十六进制写出文件,是二进制的2倍字节数
fle16=binascii.hexlify(buf)
print(len(fle16))
# 解析二进制
print(sct.unpack_from(fle2,0))
# 解析十六进制
print(sct.unpack_from(binascii.unhexlify(fle16),0))
混合结构,读写例子
import struct
import binascii
import ctypes
b_str=bytes('abc',encoding='ascii')
valuesct1 = (1,2.7,b_str)
valuesct2 = (22,101)
sct1=struct.Struct('if%ss'%len(b_str))
sct2=struct.Struct('ii')
# 新建内存空间,buf也是二进制
btsize=sct1.size+sct2.size
buf=ctypes.create_string_buffer(btsize)
# 打包前
hexbuf=binascii.hexlify(buf)
print('Before_b16:',binascii.hexlify(buf))
print('Before_b2:',binascii.unhexlify(hexbuf),'\n')
# 把数据打包2进制,覆盖buf内存内容
sct1.pack_into(buf,0,*valuesct1)
sct2.pack_into(buf,sct1.size,*valuesct2)
# 打包后
hexbuf=binascii.hexlify(buf)
print('After_b16:',binascii.hexlify(buf))
print('After_b2:',binascii.unhexlify(hexbuf),'\n')
# 写出2进制数据
with open('a2.txt','wb') as f:
f.write(buf)
# 写出16进制数据
with open('a16.txt','wb') as f:
f.write(hexbuf)
# 解析数据
print ('parse',sct1.unpack_from(buf,0),sct2.unpack_from(buf,sct1.size))
# 读取2进制文件
with open('a2.txt','rb') as f:
rd=f.read(btsize)
print('parse_b2:',sct1.unpack_from(rd,0),sct2.unpack_from(rd,sct1.size))
# 读取16进制文件
with open('a16.txt','rb') as f:
rd=f.read(btsize*2)
rd=binascii.unhexlify(rd)
print('parse_b16:',sct1.unpack_from(rd,0),sct2.unpack_from(rd,sct1.size))