python - 将 C 枚举位域转换为 Python

标签 python enums

看kismet的源码在packet_ieee80211.h是那段

enum crypt_type {
    crypt_none = 0,
crypt_unknown = 1,
crypt_wep = (1 << 1),
crypt_layer3 = (1 << 2),
// Derived from WPA headers
crypt_wep40 = (1 << 3),
crypt_wep104 = (1 << 4),
crypt_tkip = (1 << 5),
crypt_wpa = (1 << 6),
crypt_psk = (1 << 7),
crypt_aes_ocb = (1 << 8),
crypt_aes_ccm = (1 << 9),
//WPA Migration Mode
crypt_wpa_migmode = (1 << 19),
// Derived from data traffic
crypt_leap = (1 << 10),
crypt_ttls = (1 << 11),
crypt_tls = (1 << 12),
crypt_peap = (1 << 13),
crypt_isakmp = (1 << 14),
    crypt_pptp = (1 << 15),
crypt_fortress = (1 << 16),
crypt_keyguard = (1 << 17),
crypt_unknown_nonwep = (1 << 18),
};

我将其理解为移位位,但仅此而已。假设我有 int 706,我如何将这个数字分解成上面定义的 cryptset,即我如何提取使用了哪些 crypts 给 706,特别是移植到 python

谢谢

最佳答案

因此,您在这里必须了解的是,此枚举定义了一系列 bitmasks .在这种情况下,这些枚举值中的每一个(以二进制形式)包含一个且仅包含一个 1。例如,

crypt_wep = (1 << 1) = 0b10
crypt_wpa = (1 << 6) = 0b1000000

等等。使用位移运算符只是表示“我希望第 n+1 个二进制数字作为标志”的简单方法

这让我们可以按位 将这些值组合在一起,并得到一个魔数(Magic Number),它将这些 crypt 值的组合唯一地描述为位标志。要测试一个魔数(Magic Number)是否包含一个值,我们可以简单地按位它与我们希望测试的值

magic_number = crypt_wep | crypt_wpa
has_wep      = (magic_number & crypt_wep) == crypt_wep
has_wpa      = (magic_number & crypt_wpa) == crypt_wpa

has_wephas_wpa 将是 true 当且仅当 magic_number 包含那些位标志。

让我们看看数字 706,它的二进制形式是 0b1011000010。我们可以看一下,立即发现它一定是用 crypt_wepcrypt_wpacrypt_pskcrypt_aes_ccm 构建的,因为为这些值设置了正确的位。

那么怎么移植到python呢?好吧,python 有 enums如果您使用的是 python 3.4 或更高版本,就像 C/C++ 一样。因此,您可以简单地在 Python 中创建相同的枚举表,并应用相同的按位测试来确定您的魔数(Magic Number)代表什么。如果你使用的是没有枚举的 python 版本,你可以简单地定义一个包含一些静态常量的类来获得相同的效果(并构建一个方法来测试一个魔数(Magic Number)包含的一组密码).这样的类可能如下所示:

class CryptKeys(object):
    crypt_masks = {
                    'crypt_unknown':1,
                     ....
                    'crypt_unknown_nonwep': (1 << 18)
                   }
    @classmethod
    def find_crypts(cls, magic_number):
        if magic_number == 0:
            return ['crypt_none']
        else:
            return [name for name, mask in cls.crypt_masks.items() if magic_number & mask == mask]

关于python - 将 C 枚举位域转换为 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23324957/

相关文章:

Python for循环遍历一列的所有行

python - 使用 SQLAlchemy 枚举数据库中的查找表?

不同文件中枚举和数组的一致性检查

python - 使用 ffmpeg-python : [NULL @ 000002486ae7b180] Unable to find a suitable output format for 获取错误消息

python - 在急切执行期间不支持 session 关键字参数。您通过了 : {'learning_rate' : 1e-05}

java - 使用 JDBI3 保留枚举字段的简洁方法?

c++ - 在 C++ 中使用枚举编程 iota 相似性

swift - 覆盖子类中的枚举情况

python - 通过空子类对对象进行分类是 Pythonic 吗?

python - 迭代嵌套列表以生成最小和最大值,忽略 NoneType