首页 > 编程语言 >C-like structures in Python

C-like structures in Python

时间:2024-01-28 12:56:00浏览次数:34  
标签:__ like Python data self bytes ctypes x00 structures

bytes转Structure

def convert_bytes_to_structure(st: object, byte: bytes):
    assert  ctypes.sizeof(st) ==len(byte),'size error! need:%d,give:%d'%(ctypes.sizeof(st),len(byte))
    # ctypes.memmove(ctypes.pointer(st), byte, ctypes.sizeof(st))
    ctypes.memmove(ctypes.addressof(st), byte, ctypes.sizeof(st))

使用ctypes Structure来转换c中的结构体

class TYPE_BASE(ctypes.LittleEndianStructure):
    _pack_: int = 1
    def __init__(self, data: Union[bytes, list, tuple, set]) -> None:
        if isinstance(data, bytes):
            convert_bytes_to_structure(self, data)
        elif isinstance(data, (list, tuple, set)):
            convert_bytes_to_structure(self, bytes(data))
        elif isinstance(data, io.IOBase):
            data.readinto(self)
'''
struct MyClass{
    int val1;
    int val2;
    char buf[10];
};
'''
class MyClass(TYPE_BASE):
    # _pack_: int = 1
    _fields_: list = [
        ("val1", ctypes.c_int32),
        ("val2", ctypes.c_int32),
        ("buf", ctypes.c_byte * 10),
    ]
    # def __init__(self, data: Union[bytes, list, tuple, set]) -> None:
    #     super().__init__(data)

    def __str__(self) -> str:
        info=''
        info+='val1:%s\n'%self.val1
        info+='val2:%s\n'%self.val2
        info+='buf:%s\n'%bytes(self.buf)
        return info
def test_ty():
    # data=[1,0,0,0,2,0,0,0]+list(b'a'*10)
    data=int.to_bytes(1,4,'little')+int.to_bytes(2,4,'little')+b'a'*10
    obj=MyClass(data)
    print('bytes(obj):',bytes(obj))
    print(obj)
    
    data2=[10,0,0,0,20,0,0,0]+list(b'b'*10)
    #do not call __init__; use from_buffer_copy
    obj2=MyClass.from_buffer_copy(bytes(data2))
    print('bytes(obj2):',bytes(obj2))
    print(obj2)

输出:

bytes(obj): b'\x01\x00\x00\x00\x02\x00\x00\x00aaaaaaaaaa'
val1:1
val2:2
buf:b'aaaaaaaaaa'

bytes(obj2): b'\n\x00\x00\x00\x14\x00\x00\x00bbbbbbbbbb'
val1:10
val2:20
buf:b'bbbbbbbbbb'

标签:__,like,Python,data,self,bytes,ctypes,x00,structures
From: https://www.cnblogs.com/DirWang/p/17992752

相关文章

  • python-01注释
    一.注释的作用没有注释的代码添加注释的代码通过用自己熟悉的语言,在程序中对某些代码进行标注说明,这就是注释的作用,能够大大增强程序的可读性。二.注释的分类及语法注释分为两类:单行注释和多行注释。单行注释只能注释一行内容,语法如下:#注释内容多行......
  • python 1
    importmathdeflcm(a,b):print('最大公约数math.gcd({},{})'.format(a,b),math.gcd(a,b))returna*b//math.gcd(a,b)deflcm_range(n):lcm_value=1foriinrange(2,n+1):lcm_value=lcm(lcm_value,i)returnl......
  • Python手相识别教程16四种元素手型分类
    16四种元素分类16.1火、水、气、土虽然手掌的七种原型是评估性格的首选指南,但从多个角度看手掌也是明智之举。七种原型可以让我们看到人类大家庭中更广泛的差异。原型与原型之间的相互结合,以及基本修饰语的应用,可以让我们深入了解我们正在阅读的人的手相。虽然七种原型提供了......
  • python pandas字符处理一
    s=pd.Series(['lower','CAPITALS','thisisasentence','SwApCaSe'])s.str.lower()#转为小写s.str.upper()#转为大写s.str.title()#标题格式,每个单词大写s.str.capitalize()#首字母大写s.str.swapcase()#大小写互换s.str.casefold()#转为小......
  • python pandas 文本切片处理
    文本分隔对文本的分隔和替换是最常用的文本处理方式。对文本分隔后会生成一个列表,我们对列表进行切片操作,可以找到我们想要的内容。分隔后还可以将分隔内容展开,形成单独的行。下例以下划线对内容进行了分隔,分隔后每个内容都成为一个列表。分隔对空值不起作用。#构造数据s=p......
  • python pandas文本替换
    文本替换在进行数据处理时我们可以使用替换功能剔除我们不想要的内容,换成想要的内容。这在数据处理中经常使用,因为经过人工整理的数据往往不理想,需要进行替换操作。我们使用.str.replace()方法来完成这一操作。例如,对于以下一些金额数据,我们想去除货币符号,为后续转换为数字类型......
  • python pandas文本连接
    文本连接方法s.str.cat()具有文本连接的功能,可以将序列连接成一个文本或者将两个文本序列连接在一起。#文本序列s=pd.Series(['x','y','z'],dtype="string")#默认无符号连接s.str.cat()#'xyz'#用逗号连接s.str.cat(sep=',')#'x,y,z'如果序列中有空值......
  • PYTHON用时变马尔可夫区制转换(MARKOV REGIME SWITCHING)自回归模型分析经济时间序列|附
    全文下载链接:http://tecdat.cn/?p=22617最近我们被客户要求撰写关于MRS的研究报告,包括一些图形和统计输出。本文提供了一个在统计模型中使用马可夫转换模型模型的例子,来复现Kim和Nelson(1999)中提出的一些结果。它应用了Hamilton(1989)的滤波器和Kim(1994)的平滑器  %matplot......
  • python语言理解
    类python是一门面向对象的语言,强调的是对象,当我们创建一个类时,必然要给这个类赋予对应的属性去描述它,例如一个动物的类,那么这个类应该有动物种类,颜色,年龄,体重,习性等属性,代码如下:classAnimal:def__init__(self,species,color,age,weight,habitat):self.spec......
  • Python 潮流周刊第 37 期(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。周刊全文:https://pythoncat.top/posts/2024-01-27-weekly以下是本期摘要:......