猿友 2024-05-09 19:32 采纳率: 66.7%
浏览 4
已结题

一个对python ctypes的疑问

我想将一个由ctypes中Structure创建的结构体转为python中的bytes,在网上我找到了三种方法,示例如下:

from ctypes import (
    BigEndianStructure,
    c_uint16,
    sizeof,
    addressof,
    byref,
    memmove,
    string_at,
    create_string_buffer
)


class Flags(BigEndianStructure):
    _fields_ = [
        ("QR",          c_uint16, 1),   # 查询应答标志
        ("Opcode",      c_uint16, 4),   # 查询应答类型
        ("AA",          c_uint16, 1),   # 权威回答
        ("TC",          c_uint16, 1),   # 截断
        ("RD",          c_uint16, 1),   # 递归查询标志
        ("RA",          c_uint16, 1),   # 可递归
        ("Z",           c_uint16, 3),   # 保留字段
        ("RCode",       c_uint16, 4)    # 返回码
    ]

flags = Flags(1, 1, 0, 1, 1, 1, 1, 1)
# 对应二进制
# 0b 1 0001 0 1 1 1 001 0001 --> 0b10001011 10010001
size = sizeof(Flags)

# 方法一
ptr1 = addressof(flags)
s1 = string_at(ptr1, size)
b1 = int(s1[0])
b2 = int(s1[1])
print(s1)
print(bin(b1), bin(b2))

# 方法二
ptr2 = byref(flags)
s2 = string_at(ptr2, size)
print(s2)

# 方法三
buffer = create_string_buffer(size)
memmove(buffer, ptr2, size)
s3 = buffer.raw
# 或者
# s3 = bytes(buffer)
print(s3)

运行结果:

b'\x8b\x91'
0b10001011 0b10010001
b'\x8b\x91'
b'\x8b\x91'

与预期的结果一样,但是这三种方法有什么区别?或者说这种写法有没有问题?

  • 写回答

3条回答 默认 最新

  • 专家-皆知 2024-05-09 19:32
    关注

    引自免费微信小程序:皆我百晓生

    你可以使用struct模块的pack方法将Structure对象转换为bytes,如:bytes_object = struct.pack('%ds' % ctypes.sizeof(your_structure), your_structure)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月18日
  • 已采纳回答 5月10日
  • 创建了问题 5月9日

悬赏问题

  • ¥20 关于游戏c++语言代码问题
  • ¥15 如何制作永久二维码,最好是微信也可以扫开的。(相关搜索:管理系统)
  • ¥15 delphi indy cookie 有效期
  • ¥15 labelme打不开怎么办
  • ¥35 按照图片上的两个任务要求,用keil5写出运行代码,并在proteus上仿真成功,🙏
  • ¥15 免费的电脑视频剪辑类软件如何盈利
  • ¥30 MPI读入tif文件并将文件路径分配给各进程时遇到问题
  • ¥15 pycharm中导入模块出错
  • ¥20 Ros2 moveit2 Windows环境配置,有偿,价格可商议。
  • ¥15 有关“完美的代价”问题的代码漏洞