我有一个很大的十六进制数字字符串,要在其上执行一些按位运算。我试图从中提取不同的字节,然后应用按位或,与,异或运算。不幸的是,我不知道这样做的简单方法,因此每次我想执行按位运算时,我都将十六进制转换为整数。这是一个简化的代码。
data = "0x4700ff1de05ca7686c2b43f5e37e6dafd388761c36900ab37"
hex_data = "0x" + data[20:32]
four_bytes = hex_data[:10]
fifth_byte = "0x" + hex_data[10:12]
lshift_fourb = hex(int(four_bytes, 16) << 1)
bitwise_or_res = hex(int(lshift_fourb, 16) | int(fifth_byte, 16))
是否有一种简便的方法可以忽略将常量转换为整数和来回十六进制的操作,以便进行相同的操作。我更喜欢使用十六进制或二进制,因为我需要从输入数据字符串中提取某些字节,而hex(int(hex_number, 16))
似乎有点重复和乏味。如果我不将其转换为整数,Python会抱怨它无法对字符串执行|
或^
。
答案 0 :(得分:2)
如何?
data = "0x4700ff1de05ca7686c2b43f5e37e6dafd388761c36900ab37"
size = (len(data)-2)//2
data_bytes = int(data,16).to_bytes(size,byteorder='big')
现在您可以执行以下操作:
data_bytes[4] & data_bytes[5]
答案 1 :(得分:2)
正如您所提到的,问题在于十六进制数字的字符串更易读,并且对切片和至少一些移位操作有好处,但不支持按位操作。另一方面,整数支持按位运算,但不支持切片。最接近您想要的是创建一个实现两个功能的自定义类(在需要时进行转换)。这不会使您不必执行(和执行)更复杂的代码,但是您的应用程序的其余部分可能更具可读性,因为转换是“隐藏的”。