2017-04-12 11 views
1

整数をバイト列の配列に変換しようとしています。負の数の2の補数の16進数を取得

def int2Hex(): 
    hex = '%08x' % 32 
    bytes = [] 

    for i in range(0,4): 
     bytes.append('0x' + hex[i*2: i*2 + 2]) 

    return bytes[::-1] #return in little endian 

上記のコードは正の数の作品:['0x00', '0x00', '0x00', '0x20']

が、私は負の数を使用する場合、私はこのような何か買ってあげる:['0x-0', '0x00', '0x00', '0x20']

私は負の数のためにしたいことは2の補数ですバイト。私はあなたがそれが役に立つことを願っ

def int2hex(number, bits): 
    """ Return the 2'complement hexadecimal representation of a number """ 

    if number < 0: 
     return hex((1 << bits) + number) 
    else: 
     return hex(number) 

:私はあなたがこれを使用することができますのpython 2.

+0

内部どのような形式が対応することになって、 "バイト" していますか? 'int'sは32ビットとビッグエンディアンではありません。範囲外の数字はどうですか? –

+0

タスクは、符号付き整数を符号なしに変換することに変わりはありません。 –

答えて

1

変換される数値が常に正であることを確認してから、下位32ビットをマスクすると、メソッドが機能します。

コード:

OFFSET = 1 << 32 
MASK = OFFSET - 1 

def int2Hex(num): 
    hex = '%08x' % (num + OFFSET & MASK) 
    bytes = [] 

    for i in range(0, 4): 
     bytes.append('0x' + hex[i * 2: i * 2 + 2]) 

    return bytes[::-1] # return in little endian 

print(int2Hex(20)) 
print(int2Hex(-20)) 

結果: - いくつかの特定の一つまたはシステムのネイティブ

['0x14', '0x00', '0x00', '0x00'] 
['0xec', '0xff', '0xff', '0xff'] 
1

を使用しています!

+0

また、 'assert number >> bits == 0 'を持つべきです - 意図したビット数よりも大きい数の場合、アルゴリズムはガーベジを返します。 –

+0

厳密に言えば、h =( "%% 0%d"%)の範囲では、[['0x' + h [i:i + 1] (bits // 4))%hex(...) 'を使用して問題のステートメントに従います。しかし、それは無関係の懸念なので、私はそれを気にしません。 –