字符串上的位操作Python3.7

字符串上的位操作Python3.7,python,python-3.x,bit-manipulation,bitwise-operators,Python,Python 3.x,Bit Manipulation,Bitwise Operators,我有一个十六进制数的大字符串,我想对它执行一些位操作。我试图从中提取不同的字节,然后应用按位OR、and和XOR操作。不幸的是,我不知道一种简单的方法来实现这一点,所以每次我想执行位操作时,我都会将十六进制转换成整数。这是一个简化的代码 data = "0x4700ff1de05ca7686c2b43f5e37e6dafd388761c36900ab37" hex_data = "0x" + data[20:32] four_bytes = hex_data[:10] fifth_byte =

我有一个十六进制数的大字符串,我想对它执行一些位操作。我试图从中提取不同的字节,然后应用按位OR、and和XOR操作。不幸的是,我不知道一种简单的方法来实现这一点,所以每次我想执行位操作时,我都会将十六进制转换成整数。这是一个简化的代码

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))
有没有一种简单的方法可以省略对整数和十六进制的常量来回转换,以便执行相同的操作。我更喜欢使用十六进制或二进制,因为我需要从输入数据字符串和十六进制x_数中提取某些字节,16似乎有点重复和乏味。如果我不将其转换为整数,Python会抱怨它无法在字符串上执行|或^

这个怎么样:

data = "0x4700ff1de05ca7686c2b43f5e37e6dafd388761c36900ab37"
size = (len(data)-2)//2
data_bytes = int(data,16).to_bytes(size,byteorder='big')
现在您可以执行以下操作:

data_bytes[4] & data_bytes[5]
这个怎么样:

data = "0x4700ff1de05ca7686c2b43f5e37e6dafd388761c36900ab37"
size = (len(data)-2)//2
data_bytes = int(data,16).to_bytes(size,byteorder='big')
现在您可以执行以下操作:

data_bytes[4] & data_bytes[5]


正如您所提到的,问题在于十六进制数字字符串更具可读性,适合于切片和至少一些移位操作,但不支持按位操作。另一方面,整数支持按位运算,但不支持切片。最接近您想要的可能是创建一个实现这两个特性的自定义类,并在需要时进行转换。这不会使您免于实现和执行更复杂的代码,但应用程序的其余部分可能更可读,因为转换是隐藏的。

正如您所提到的,问题是十六进制数字字符串更可读,适合切片和至少某些移位操作,但不支持按位操作。另一方面,整数支持按位运算,但不支持切片。最接近您想要的可能是创建一个实现这两个特性的自定义类,并在需要时进行转换。这不会使您免于实现和执行更复杂的代码,但应用程序的其余部分可能更可读,因为转换是隐藏的。

将字符串转换为整数一次,然后在整数域中执行所有操作,最后只转换回字符串一次。@mkrieger1 integer,不支持切片,因此计算十六进制数据和四个字节必须用模计算。可能,但也很枯燥。但我应该如何从整数中提取特定字节?通过移位和掩蔽。您还可以编写一些辅助函数来消除重复内容。将字符串转换为整数一次,然后在整数域中执行所有操作,最后只转换回字符串一次。@mkrieger1 integer,但是,不支持切片,因此计算十六进制数据和四个字节必须用模计算。可能,但也很枯燥。但我应该如何从整数中提取特定字节?通过移位和掩蔽。你也可以编写一些辅助函数来排除重复的内容。这似乎可行,但我不知道为什么,当我打印数据字节时,它给了我b'+C\xf5\xe3~m'我期望像b'\x2b\x43\xf5\xe3\x7e\x6d这样的东西,以及如何从数据字节中提取前4个字节。我也不能对字节和整数执行逐位操作,所以我需要将字节转换为整数或将整数转换为字节。我已经理解了为什么数据字节的格式,我需要在末尾用.hex打印它们,否则,它会试图匹配ASCII码。我的意思是当我尝试执行数据字节[3]作为一种解决方法,我需要使用int.from_bytesdata_bytes,byteorder=big将字节转换为整数,以便执行按位左移或右移。至少在我的机器上,打印数据_字节会产生所需的结果。请注意,我已经编辑了答案中的代码。这似乎可行,但我不知道为什么,当我打印数据字节时,它会给我b'+C\xf5\xe3~m'我期望类似于b'\x2b\x43\xf5\xe3\x7e\x6d的内容,以及如何从数据字节中提取前4个字节。我也不能对字节和整数执行逐位操作,所以我需要将字节转换为整数或将整数转换为字节。我已经理解了为什么数据字节的格式,我需要在末尾用.hex打印它们,否则,它会试图匹配ASCII码。我的意思是当我尝试执行数据字节[3]作为一种解决方法,我需要使用int.from_bytesdata_bytes,byteorder=big将字节转换为整数,以便执行按位左移或右移。至少在我的机器上,打印数据_字节会产生所需的结果。请注意,我已经编辑了答案中的代码。这正是我的观点。十六进制是完美的切片,但我需要转换它的所有时间,以执行位运算。这正是我的观点。十六进制是完美的切片,但我需要转换它的所有时间,以执行位操作。