0

次のような16進配列があります。

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

これをバイナリに変換すると、次のようになります。0011000100110001

各ビットは、配列内の数値に関連するフラグです。この場合、この 2 進数は 2、3、7、10、11、15 になります。

この表記法に名前があるかどうかはわかりませんが、上記のように 16 進数を変換して 10 進数のリストを取得する簡単な方法はありますか。

そう、

それぞれ0x31が 1 バイトまたは 8 ビットに相当します。

それぞれ0x31に変換し00110001ます。

このバイナリが解釈されるはずの方法は次のとおりです。

0 1 2 3 4 5 6 7 8 9 10
0 0 1 1 0 0 0 1 ......

ここでは、0x31.

これが理にかなっていることを願っています。どんな助けでも大歓迎です。

4

6 に答える 6

5

したがって、スペースで区切られた文字列に 16 進数があります。

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'

次に、文字列を分割し、各バイトを 16 進文字列から intint('31', 16) == 49に変換し ( )、それをバイナリ文字列に変換し ( )、 withbin(49) == '0b110001'を取り除き、最初にゼロを追加して、シーケンスが正確に 8 の長さになるようにします ( )。次に、すべてのビット文字列を 1 つの文字列に結合します。'0b'[2:]'110001'.zfill(8) == '00110001'

s = ''.join(bin(int(b, 16))[2:].zfill(8) for b in s.split())
# Now `s` is '0011000100110001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
  • 上記の行の代替で、Python 2.5 で動作します。
    トランス = {'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(s.lower() の c のトランス[c])

次にenumerate、ビットなので、説明したように、すべてのビット ( b) に対応する位置 ( i) があります。リスト内包表記を使用し、記号が である位置のみを含めます'1'

r = [i for i, b in enumerate(s) if b=='1']
# Now `r` is [2, 3, 7, 10, 11, 15]
于 2012-08-08T20:24:26.467 に答える
2

まず最初に、16 進配列を整数に変換し、次に 2 進数に変換する必要があります。これはPythonでは非常に簡単です:

myBin = bin(int("".join(hexArray),16))[2:].zfill(len(hexArray)*8) #We slice to get rid of the "0b" prepended by the bin function. zfill puts in leading zeros so we don't miss anything

それに続いて、必要な数値を取得するために、いくつかのクールな列挙とリストの理解を行うことができます。

myInts = [off for x, off in enumerate(myBin) if x == "1"]

したがって、既に 16 進数が配列にあると仮定すると、探している答えが得られます。

于 2012-08-08T20:23:35.597 に答える
1

事前計算された位置リストを使用する:

arr = [0x31, 0x31, 0, 0, 0]
print [(8*byte_ind + i) for byte_ind, b in enumerate(arr) for i in positions[b]]
# -> [2, 3, 7, 10, 11, 15]

すべての ( 256 positions) バイトを対応する位置にマップします。

>>> def num2pos(n):
...     return [i for i, b in enumerate(format(n, '08b')) if b == '1']
... 
>>> positions = map(num2pos, range(0x100))
>>> positions[0x31]
[2, 3, 7]

配列が実際に 16 進文字列である場合は、それを bytearray に変換できます。

>>> import binascii
>>> arr = bytearray(binascii.unhexlify(s.replace(' ', '')))
>>> arr
bytearray(b'11\x00\x00\x00\x00\x00...\x00')
于 2012-08-08T22:13:31.860 に答える
0
>>> print int('31', 16)
49

そこから、リスト内包表記またはジェネレータ式を使用して、複数の値を実行できます。

于 2012-08-08T20:17:36.970 に答える
0

私はあなたが探していることを次のようにすると思います:

def to_int_list(hex_array):
    hex_str = ''.join(hex_array)
    value = int(hex_str, 16)
    i = 4*len(hex_str) - 1
    result = []
    while value:
        if value & 1:
            result.append(i)
        value = value >> 1
        i -= 1
    return result[::-1]


>>> to_int_list(['31', '31', '00', '00', '00', '00'])
[2, 3, 7, 10, 11, 15]
于 2012-08-08T20:30:54.203 に答える