【发布时间】:2021-10-31 23:23:15
【问题描述】:
我有一个长度为 6 个字节(48 位)的字节数组。只有每个字节的前六位是相关的。高两位不包含数据,因此应忽略。转换为数字时不应包含它们。
我想从字节数组中提取特定范围的位并将其转换为数字,同时忽略每个字节的高两位。
例如
以如下字节数组为例:b'\x12\x08\x1c\x30\x32\x21'
位 47 -> 00010010 00001000 00011100 00110000 00110010 00100001
如果我想要位 0 到 15 的值。答案应该是 3233(1+32+128+1024+2048)
00010010 00001000 00011100 00110000 00110010 00100001
^^^^ XX^^^^^^ XX^^^^^^
如果我想要位 6 到 12 的值。它应该是 50 (2+16+32)
00010010 00001000 00011100 00110000 00110010 00100001
^ XX^^^^^^ XX
我可以在脑海中笨拙地做到这一点,但我在 Python 中遇到了问题。这些是我认为我应该做的步骤,但我不确定这是否是最好/最简单的方法,也不知道我应该如何做......
- 将我的字节数组转换为包含其二进制值的单个字符串
- 将二进制字符串的每第七个和第八个字符(从右侧计数)更改为另一个字符(例如“-”)。
- 从新字符串中删除任何“-”字符。 [已编辑]
- 从二进制字符串中提取我想要的位。 [已编辑]
- 将该字符串从二进制转换为值。
...所以...
1 .如何获取我的字节数组并转换为 48 位二进制字符串?
2.有没有一种简单的方法可以将我的二进制字符串中的每第七和第八位更改为“-”?
5.将包含二进制值的字符串转换为数字?
...我的思考过程在这方面有什么好处吗,或者有更简单的方法来完成这个吗?
非常感谢您对此提供的任何帮助。
[编辑] 我认为我的问题中的第 3 步和第 4 步顺序错误...我想在提取二进制数字之前删除不需要的位。相应地编辑了问题。[/edit]
【问题讨论】:
-
所以你想丢弃 2 MSB 并合并?所以
00110010 00100001变成了110010100001?你熟悉按位运算符吗? -
是的,我很熟悉它们。我的问题是我需要先提取这些位,然后才能将它们转换为数字。提取这些位之后,我失去了关于它们在被提取之前所持有的位置的参考,所以我不知道要忽略哪些位。
-
我应该注意,我在上面的示例中插入了空格以提高可读性。这些空格不会存在于脚本使用的实际数据中。
-
我想我不理解目标。你如何从
00110010 00100001得到1185?如果您删除每个数字中的 2 个最高有效位,您将得到110010 100001。如果你加入那些你得到 3233。