Как преобразовать число с плавающей запятой с основанием 10 в шестнадцатеричное в Python 2.4?

Я пытаюсь преобразовать числа из десятичного в шестнадцатеричный. Как преобразовать значения float в шестнадцатеричные или символьные в Python 2.4.3?

Затем я хотел бы иметь возможность распечатать его как ("\xa5\x (здесь новый шестнадцатеричный номер)"). Как мне это сделать?


person user349845    schedule 25.05.2010    source источник
comment
Связано: stackoverflow.com/questions/1592158/python-convert -hex-to-float   -  person miku    schedule 25.05.2010
comment
Вам нужно двоичное представление числа с плавающей запятой IEEE в шестнадцатеричном формате, вам нужна только целая часть в шестнадцатеричном формате или все это в шестнадцатеричном формате?   -  person Gabe    schedule 25.05.2010
comment
Привет, какая тебе от этого польза? Вы пытаетесь сохранить десятичную точность, если печатаете/читаете число? Возможно, вы захотите взглянуть на десятичные числа с плавающей запятой для этого, это намного более портативно, и вы не закончите с разъяренной толпой у ваших ворот с факелами и вилами.   -  person Matt Curtis    schedule 25.05.2010


Ответы (3)


Из python 2.6.5 docs в шестнадцатеричном (x) определении:

Чтобы получить шестнадцатеричное строковое представление для числа с плавающей запятой, используйте метод float.hex().

person joaquin    schedule 25.05.2010
comment
не могли бы вы привести пример его использования? Я пытаюсь преобразовать этот 0,554 в шестнадцатеричный с помощью float.hex (значение)? и как я могу написать это как (\x30\x30\x35\x35)? - person user349845; 25.05.2010
comment
В этом случае вы могли бы написать это как 0.554.hex(). Но результат сильно отличался бы от того, что вы ожидаете. см. docs.python.org/library/stdtypes.html#float.hex - person Jeremy Brown; 25.05.2010
comment
Я понимаю, что на самом деле OP хочет получить шестнадцатеричные значения для кодов ASCII чисел. Я не редактирую свой ответ, поскольку Джереми уже дал решение ниже. В любом случае подсказка jordan 0.554 == '\x30\x30\x35\x35' также была неверной, поскольку десятичная точка не была указана, а на самом деле '\x30\x30\x35\x35' == '0055'. - person joaquin; 25.05.2010

Судя по этому комментарию:

не могли бы вы привести пример его использования? Я пытаюсь преобразовать этот 0,554 в шестнадцатеричный с помощью float.hex (значение)? и как я могу написать это как (\x30\x30\x35\x35)? – jordan2010 1 час назад

то, что вам действительно нужно, - это шестнадцатеричное представление кодов ASCII этих числовых символов, а не фактическое число с плавающей запятой, представленное в шестнадцатеричном формате.

«5» = 53 (основание 10) = 0x35 (основание 16)

Вы можете использовать ord(), чтобы получить код ASCII для каждого символа следующим образом:

>>> [ ord(char) for char in "0.554" ]
[48, 46, 53, 53, 52]

Вы хотите удобочитаемое представление? hex() даст вам один, но он не в том формате, который вы просили:

>>> [ hex(ord(char)) for char in "0.554" ]
['0x30', '0x2e', '0x35', '0x35', '0x34']
#   0      .        5       5       4

Вместо этого вы можете использовать подстановку строк и соответствующие средства форматирования.

res = "".join( [ "\\x%02X" % ord(char) for char in "0.554" ] )
>>> print res
\x30\x2E\x35\x35\x34

Но если вы хотите сериализовать данные, рассмотрите возможность использования модуля struct для упаковки данных в буферы.

отредактировано, чтобы ответить на второй комментарий jordan2010

Вот быстрое дополнение, чтобы дополнить число ведущими нулями.

>>> padded_integer_str = "%04d" % 5
>>> print padded_integer_str
0005
>>> res = "".join( [ "\\x%02X" % ord(char) for char in padded_integer_str] )
>>> print res
\x30\x30\x30\x35

См. http://docs.python.org/library/stdtypes.html#string-formatting для объяснения форматирования строк

person Jeremy Brown    schedule 25.05.2010
comment
Это прекрасно, спасибо за это. Я упаковываю данные, но мне интересно, могу ли я удалить \x2E из \x30\x2E\x35\x35\x34 - person user349845; 26.05.2010
comment
я понял, но если бы я попытался найти для 5, я не смог бы представить его в этой форме \x30\x30\x30\x35 - person user349845; 26.05.2010

Вы не можете преобразовать число с плавающей запятой непосредственно в шестнадцатеричный. Вам нужно сначала преобразовать в int.

hex(int(value))

Обратите внимание, что int всегда округляется в меньшую сторону, поэтому вы можете явно выполнить округление перед преобразованием в int:

hex(int(round(value)))
person Daniel Roseman    schedule 25.05.2010
comment
Да, понял, но как мне это сделать; Я преобразовал шестнадцатеричный в десятичный. Однако моя проблема заключается в том, чтобы преобразовать эти десятичные числа с плавающей запятой в шестнадцатеричные числа в python. Например: шестнадцатеричное число для 0,26 равно \x30\x32\x36\x36, как это можно сделать в Python? - person user349845; 25.05.2010
comment
Что вы имеете в виду, преобразовать его в десятичную? Можете ли вы привести пример того, что вы сделали? Представление десятичных чисел может быть выполнено множеством разных способов, поэтому было бы полезно, если бы вы могли подробно описать это (или предоставить некоторый код). - person Matt Curtis; 25.05.2010