Как напечатать целое число со знаком как шестнадцатеричное число в дополнении до двух с python? - PullRequest
8 голосов
/ 13 июля 2010

У меня есть отрицательное целое число (4 байта), из которого я хотел бы иметь шестнадцатеричную форму представления его дополнения до двух.

>>> i = int("-312367")
>>> "{0}".format(i)
'-312367'
>>> "{0:x}".format(i)
'-4c42f'

Но я хотел бы видеть "FF ..."

Ответы [ 6 ]

5 голосов
/ 13 июля 2010

Вот способ (для 16-битных чисел):

>>> x=-123
>>> hex(((abs(x) ^ 0xffff) + 1) & 0xffff)
'0xff85'

(может быть, не самый элегантный способ)

4 голосов
/ 13 июля 2010
>>> x = -123
>>> bits = 16
>>> hex((1 << bits) + x)
'0xff85'
>>> bits = 32
>>> hex((1 << bits) + x)
'0xffffff85'
3 голосов
/ 13 июля 2010

Использование модуля bitstring :

>>> bitstring.BitArray('int:32=-312367').hex
'0xfffb3bd1'
2 голосов
/ 27 августа 2014

Простой

>>> hex((-4) & 0xFF)
'0xfc'
1 голос
/ 28 августа 2015

Чтобы обработать целое число как двоичное значение, вы поразрядно - и оно с маской желаемой длины в битах.

Например, для 4-байтового значения (32-разрядного) мы маскируем с помощью0xffffffff:

>>> format(-1 & 0xffffffff, "08X")
'FFFFFFFF'
>>> format(1 & 0xffffffff, "08X")
'00000001'
>>> format(123 & 0xffffffff, "08X")
'0000007B'
>>> format(-312367 & 0xffffffff, "08X")
'FFFB3BD1'
0 голосов
/ 13 июля 2010

Модуль struct выполняет преобразования между значениями Python и структурами C, представленными в виде байтовых объектов Python.Упакованный объект байтов предлагает доступ к отдельным значениям байтов.Это можно использовать для отображения базового (C) целочисленного представления.

>>> packed = struct.pack('>i',i) # big-endian integer
>>> type(packed)
<class 'bytes'>
>>> packed
b'\xff\xfb;\xd1'
>>> "%X%X%X%X" % tuple(packed)
'FFFB3BD1'
>>> 
...