2013-05-08 4 views
4

Это один из тех глупых вопросов, и я не знаю, как его сформулировать, поэтому приведу пример. Я получилPython: получить значение int из строки char

v = chr(0xae) + chr(0xae) 

где #AEAE есть, в десятичной системе счисления, значение 44718.

Мой вопрос, как я получаю целое значение v? Я знаю о ord(), но я могу использовать его только для символа, а не для строки.

спасибо.

ответ

3

мне удалось сделать это с помощью struct модуля:

import struct 
int_no = struct.unpack('>H', v)[0] 
print int_no 

который выдает желаемые результаты:

44718 
1

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

>>> int("AEAE",16) 
44718 

или

>>> int("0xAEAE",16) 
44718 

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

>>> (ord('\xae') << 8) | (ord('\xae')) 
44718 

Я не уверен, если есть лучше хотя.

+0

Вопрос заключается в том, что я получаю эти данные с удаленного сервера, который представлен в качестве '' \ xae \ xae'', поэтому мне нужно преобразовать в 'int()' – ov1d1u

0

легче держать шестигранник в виде строки и использовать int():

int("AEAE", 16) 
2

Вы можете преобразовать произвольную длину строки байтов int или long используя один из этих выражений.

i = reduce(lambda x, y: (x<<8)+ord(y), v, 0) 
i = reduce(lambda x, y: (x<<8)+ord(y), reversed(v), 0) 

Используйте один из них для данных по-младшего, а другой для данных типа «большой». Или наоборот.

1

Ну, прямой путь будет идти:

def convert(v): 
    x = 0 
    for c in v: 
     x *= 256 
     x += ord(c) 
    return x 

Если вы хотите иметь крайний левый символ иметь наибольшее значение.

Вы можете вернуть v заранее, чтобы получить противоположный конец.

Смежные вопросы