【问题标题】:How to convert the below struct in c to python? [closed]如何将c中的以下结构转换为python? [关闭]
【发布时间】:2020-12-28 00:26:26
【问题描述】:

如何将 ieee80211_hdr(下)转换为可以解码字节数组并存储变量的 python 结构?

谢谢

struct ieee80211_hdr {
    unsigned char frame_control[2];
    unsigned char duration_id[2];
    unsigned char addr1[6];
    unsigned char addr2[6];
    unsigned char addr3[6];
    unsigned char seq_ctrl[2];
    unsigned char addr4[6];

};

【问题讨论】:

标签: python network-programming netlink


【解决方案1】:

请使用 StackOverflow 的功能将代码嵌入为文本,而不是使用图像。

您如何使用struct 转换为class,如下所示:

class ieee80211_hrd:
    def __init__(self, frame_control, duration_id, addr1, addr2, addr3, seq_ctrl, addr4):
        self.frame_control = frame_control
        self.duration_id = duration_id
        self.addr1 = addr1
        self.addr2 = addr2
        self.addr3 = addr3
        self.seq_ctrl = seq_ctrl
        self.addr4 = addr4

这将创建一个您可以像这样使用的对象

thing = ieee80211_hrd("ab", "cd", "efghij", "klmnop", "qrstuv", "wx", "yz1234")
print(thing.addr3)
# and so on, where `thing.addr3`, etc. are persistent variables in the class instance `thing`

【讨论】:

  • 您好,请考虑是否像“struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)data;”这样的行。如果数据是字节数组,一个类如何将其拆分为变量?例如,我正在获取字节数组格式的传入数据。如果我创建一个 ieee80211_hdr() = data 类的对象;其中 data=b'\x42\x00\x00.....' 。 ieee80211_hdr.addr1=42:00:..." 它是这样工作的吗?我不这么认为。但是感谢您的回复..
  • 你可以做类似instance = ieee80211_hdr(data[0:2], data[2:4], data[4:8], ...)
  • ������ ������ ������ ������ ������ ������ 嗨,我尝试对字节数组进行切片根据 ieee80211_hdr 格式,但我在打印 hdr.addr1 时看到上述信息,而不是 42:00::.. 的 mac addr
  • 您复制粘贴不起作用,但听起来您可能想忽略“:”字符,这可能只是调整您切片的索引。 (比如 [0:2] [3:5] [6:10]。)
  • @HunterMorris IEEE 802.11 中的字段不是字符串,而是打包的二进制数据。
【解决方案2】:

python中有一个struct类。 https://docs.python.org/3/library/struct.html

此模块执行 Python 值和表示为 Python 字节对象的 C 结构之间的转换。

你也可以看看 package dpkt https://dpkt.readthedocs.io/en/latest/index.html

【讨论】:

  • 嗨,我尝试了 struct.unpack 格式为“2B2B6B6B6B2B6B”,其中 B 是无符号字符,根据 ieee80211_hdr 结构,2 表示 B 的 2,这是从 c 结构解包到 python 的正确格式吗?这是将数据解压缩成二进制,但 mac 的数据是十六进制的。我应该再次尝试对 bin 数据进行 hexify 处理吗?
猜你喜欢
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 2019-02-11
  • 2023-01-22
  • 1970-01-01
相关资源
最近更新 更多