Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何从字节中提取特定位?_Python_Python 3.x - Fatal编程技术网

Python:如何从字节中提取特定位?

Python:如何从字节中提取特定位?,python,python-3.x,Python,Python 3.x,我有一条信息,内容是14090079 3d 00227。我可以通过调用message[4]从该消息中提取每个字节,例如,这将为我提供3d。如何从该字节中提取单个8位?例如,如何将位24-27作为单个消息获取?第28位怎么样?要回答问题的第二部分,您可以使用逐位运算获得特定的位值 # getting your message as int i = int("140900793d002327", 16) # getting bit at position 28 (counting from 0 fr

我有一条信息,内容是
14090079 3d 00227
。我可以通过调用
message[4]
从该消息中提取每个字节,例如,这将为我提供
3d
。如何从该字节中提取单个8位?例如,如何将位24-27作为单个消息获取?第28位怎么样?

要回答问题的第二部分,您可以使用逐位运算获得特定的位值

# getting your message as int
i = int("140900793d002327", 16)
# getting bit at position 28 (counting from 0 from right)
i >> 28 & 1
# getting bits at position 24-27
bin(i >> 24 & 0b111)

最简单的方法是使用&运算符。使用
int(str\u msg,16)
将消息转换为int。使用
bin(myint)

要获取字节中的位4-6(从左起):

>> msg = int("10110111", 2) # or 0b10110111
>> extractor = int("00011100", 2) # or 0b10110111
>> result = msg & extractor
>> print bin(result)
00010100

如果需要,可以使用
result>>2
对结果进行位移位。显然,您希望使其更具动态性,但这是一个简化的示例。

那么,您是在问如何在python中将基数为16的整数表示为基数为2,还是在问如何提取数字的某些位?或者两者兼有,提取某些位并以二进制显示?该消息的数据类型是什么?请提供Python文本。@StefanPochmann可能会将相关位移到整数的开头<代码>3B 00 00 00比
3B
@TemporalWolf更烦人,这不是我的意思。查看更新后的答案,了解我的意思。@StefanPochmann,他正在演示两个不同的例子?@TemporalWolf,嗯?这并不是他们改变的,重点是:我想得到位置24、25和26的三位值,为了做到这一点,我们的想法是移位这些位,使位置变成0、1和2,然后对一个1到位置0、1、2和0的数字进行and运算。我本可以只写24&7,但我认为用二进制写会更清楚。在基数2中输入28可能比在基数10中更容易。使用
0b11100
可以更清楚地知道哪些位您不确定新版本比旧版本好还是更差。为什么不使用@jacoblaw展示的东西呢?我只是一个例子。这个人不是问如何获得输入,而是问结果。他如何获得输入取决于他自己。我相信他已经知道了。@Ian Kirkpatrick我只是提一下,因为你似乎不知道用python输入二进制的这种方法,如果不是这样的话,对不起,我不是有意冒犯你。但我的意思不是将二进制的字符串表示形式转换为整数,而是执行
msg=0b1011011
。您可以使用hex执行类似的操作,例如,
test=0xFF
。在某些情况下,这使代码更容易理解understand@jacoblaw那种
int(“…”,2)
方式的效率也较低,因为这是一种运行时计算,而不是编译时。也许不重要,但仍然重要。更糟糕的是。