我有一个十六进制数组,看起来像:
31 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00今日00 00 00 00 00 00 00 00 00今日00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00今日00 00 00 00 00 00 00日00 00 00 00 00 00 00日00 00 00 00 00 00 00 00 00日00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
将此转换为二进制时,这看起来像: 0011000100110001
每个位都是与数组中的数字相关的标志.在这种情况下,这个二进制数将等于2,3,7,10,11,15.
我不确定这个符号是否有名称,但有没有任何简单的方法来转换十六进制以获得十进制数列表,如上所示.
所以,
每个0x31等于一个字节或8位.
每个0x31转换为00110001.
然后应该解释这个二进制文件的方式是.
0 1 2 3 4 5 6 7 8 9 10
0 0 1 1 0 0 0 1 ......
Run Code Online (Sandbox Code Playgroud)
在这里你可以看到我得到的小数值2,3,7 0x31.
希望这是有道理的.任何帮助将不胜感激.
将所有内容转换为大字符串,然后枚举它.大致类似于blaxpirit的答案,但它没有使用[:2]黑客.
array = [0x31, 0x31, 0, 0, 0]
[i for i, x in enumerate("".join(format(a, "08b") for a in array)) if x == '1']
Run Code Online (Sandbox Code Playgroud)
结果是
[2, 3, 7, 10, 11, 15]
Run Code Online (Sandbox Code Playgroud)
所以我们在空格分隔的字符串中有十六进制数字.
s = '31 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
Run Code Online (Sandbox Code Playgroud)
现在我们分割字符串,每个字节从十六进制字符串转换为int( int('31', 16) == 49),然后将其转换为二进制字符串(bin(49) == '0b110001'),然后拿走'0b'用[2:],一开始加零,因此序列精确8长('110001'.zfill(8) == '00110001').然后我们将所有位串连接在一起.
s = ''.join(bin(int(b, 16))[2:].zfill(8) for b in s.split())
# Now `s` is '0011000100110001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
Run Code Online (Sandbox Code Playgroud)
trans = {'0':'0000','1':'0001','2':'0010','3':'0011','4':'0100','5':'0101','6':'0110','7':'0111','8':'1000','9':'1001','a':'1010','b':'1011','c':'1100','d':'1101','e':'1110','f':'1111',' ':''}
s = ''.join(trans[c] for c in s.lower())那么我们enumerate就是位,所以每个bit(b)都会有一个相应的位置(i),正如你所描述的那样.我们使用列表推导并仅包括符号所在的位置'1'.
r = [i for i, b in enumerate(s) if b=='1']
# Now `r` is [2, 3, 7, 10, 11, 15]
Run Code Online (Sandbox Code Playgroud)