Python - десятичное в шестнадцатеричное, обратный порядок байтов, шестнадцатеричное в десятичное - PullRequest
3 голосов
/ 13 мая 2011

Я много читал о stuct.pack, hex и т. П.

Я пытаюсь преобразовать десятичное число в шестнадцатеричное с 2 байтами. Обратный порядок шестнадцатеричных битов, а затем преобразование его обратно в десятичное число.

Я пытаюсь выполнить следующие шаги ... в Python

Convert the decimal value **36895** to the equivalent 2-byte hexadecimal value:

**0x901F**
Reverse the order of the 2 hexadecimal bytes:

**0x1F90**
Convert the resulting 2-byte hexadecimal value to its decimal equivalent:

**8080**

Ответы [ 5 ]

7 голосов
/ 13 мая 2011
>>> x = 36895
>>> ((x << 8) | (x >> 8)) & 0xFFFF
8080
>>> hex(x)
'0x901f'
>>> struct.unpack('<H',struct.pack('>H',x))[0]
8080
>>> hex(8080)
'0x1f90'
1 голос
/ 13 мая 2011

Имейте в виду, что 'hex' (основание 16 0-9 и a-f) и 'десятичная дробь' (0-9) являются просто конструкциями для людей, чтобы представлять числа. Это все биты к машине.

Функция python hex (int) создает шестнадцатеричную «строку». Если вы хотите преобразовать его обратно в десятичное число:

>>> x = 36895
>>> s = hex(x)
>>> s
'0x901f'
>>> int(s, 16)  # interpret s as a base-16 number
1 голос
/ 13 мая 2011

Чтобы преобразовать десятичное число в шестнадцатеричное, используйте:

dec = 255
print hex(dec)[2:-1]

Это выведет шестнадцатеричное значение для 255. Чтобы преобразовать обратно в десятичное число, используйте

hex = 1F90
print int(hex, 16)

Это вывело бы десятичное значение для 1F90.

Вы должны иметь возможность обратить байты, используя:

hex = "901F"
hexbyte1 = hex[0] + hex[1]
hexbyte2 = hex[2] + hex[3]
newhex = hexbyte2 + hexbyte1
print newhex

и это выдаст 1F90. Надеюсь, это поможет!

0 голосов
/ 31 мая 2017

Мой подход


import binascii

n = 36895
reversed_hex = format(n, 'x').decode('hex')[::-1]
h = binascii.hexlify(reversed_hex)
print int(h, 16)

или одна строка

print int(hex(36895)[2:].decode('hex')[::-1].encode('hex'), 16)
print int(format(36895, 'x').decode('hex')[::-1].encode('hex'), 16)
print int(binascii.hexlify(format(36895, 'x').decode('hex')[::-1]), 16)

или с помощью bytearray

import binascii

n = 36895
b = bytearray.fromhex(format(n, 'x'))
b.reverse()
print int(binascii.hexlify(b), 16)
0 голосов
/ 13 мая 2011

Форматирование печати также работает со строками.

# Get the hex digits, without the leading '0x'
hex_str = '%04X' % (36895)

# Reverse the bytes using string slices.
# hex_str[2:4] is, oddly, characters 2 to 3.
# hex_str[0:2] is characters 0 to 1.
str_to_convert = hex_str[2:4] + hex_str[0:2]

# Read back the number in base 16 (hex)
reversed = int(str_to_convert, 16)

print(reversed) # 8080!
...