在python中转换结构

2024-10-01 15:42:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用ctypes从外部数据库中读取一些数据。在

此数据是用struct编写的。问题是,接收到的数据可能有不同的结果。 为了更好地理解: 我创建了两个结构:

class BEAM(Structure):
    _fields_ = [
        ('NR', c_ulong),
        ("NODE1", c_ulong),
        ("NODE2", c_ulong),
        ("NP", c_ulong),
        ("DL", c_float),
        ("foo", c_ulong),
        ("foobar", c_ulong),
        ("bar", c_ulong),
        ("barfoo", c_ulong)
    ]

class DUMMY(Structure):
    _fields_ = [
        ('ID', c_ulong),
        ("NODE1", c_ulong),
        ("NODE2", c_ulong),
        ("NP", c_ulong),
        ("DL", c_ulong),
        ("foo", c_ulong),
        ("foobar", c_ulong),
        ("bar", c_ulong),
        ("barfoo", c_ulong)
    ]

这种结构的区别在于“DL”中的u峎long类型。。。在假人中是u峎长,在BEAM中是u峎float。在

但在读入DATI=625后,浮点值应为625

我的问题是我怎样才能把假人扔到横梁上。在

我试过了 BEAMRecord = cast(Record, POINTER(BEAMRecord))但有一个错误名为 TypeError:必须是ctypes类型

这是我的代码:

^{pr2}$

谢谢你的帮助


解决方案:

通过阅读this thread我修改了@Mr Temp问题

我创建了一个BEAMRecordPointer = POINTER(element.BEAM)BEAMRecord = cast(Record, POINTER(BEAMRecord))我重写为BAR = cast(byref(Record), BEAMRecordPointer).contents 所以解决方案是这样的

if Record.ID > 0:
        BAR = cast(byref(Record), BEAMRecordPointer).contents
        print BAR

我做错了?在


更新1

@eryksun对cast()函数有很好的技巧。谢谢您。在


Tags: 数据fieldsbarrecordctypesstructure结构class
1条回答
网友
1楼 · 发布于 2024-10-01 15:42:39

您只需将结构加载到Union,然后按以下方式访问它:

from ctypes import *

class BEAM(Structure):
    _fields_ = [('NR', c_ulong),
                ("NODE1", c_ulong),
                ("NODE2", c_ulong),
                ("NP", c_ulong),
                ("DL", c_float),
                ("foo", c_ulong),
                ("foobar", c_ulong),
                ("bar", c_ulong),
                ("barfoo", c_ulong)]

class DUMMY(Structure):
    _fields_ = [('ID', c_ulong),
                ("NODE1", c_ulong),
                ("NODE2", c_ulong),
                ("NP", c_ulong),
                ("DL", c_ulong),
                ("foo", c_ulong),
                ("foobar", c_ulong),
                ("bar", c_ulong),
                ("barfoo", c_ulong)]

class Both(Union):
    _fields_ = [('Beam',BEAM),('Dummy',DUMMY)]

x = Both()
x.Dummy.DL = 1056964624
print(x.Beam.DL)

输出:

^{pr2}$

或者更简单地说:

from ctypes import *

class DL(Union):
    _fields_ = [('DUMMY',c_ulong),('BEAM',c_float)]

class Hybrid(Structure):
    _fields_ = [('NR', c_ulong),
                ("NODE1", c_ulong),
                ("NODE2", c_ulong),
                ("NP", c_ulong),
                ("DL", DL),
                ("foo", c_ulong),
                ("foobar", c_ulong),
                ("bar", c_ulong),
                ("barfoo", c_ulong)]

x = Hybrid()
x.DL.DUMMY = 1056964624
print(x.DL.BEAM)

(相同输出)

相关问题 更多 >

    热门问题