Получите гекс из дополнения 2 для отрицательных чисел

Я пытаюсь преобразовать целое число в массив строк байтов.

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 байта дополнения. Я использую Python 2.

2 ответа

Решение

Если вы убедитесь, что преобразуемое число всегда положительно, а затем замаскируете нижние 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']

Вы можете использовать это:

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)

Я надеюсь, что вы найдете это полезным!

Другие вопросы по тегам