利用struct打包数据

理解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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值