2016-08-10 3 views
1

Я хочу, чтобы получить значение 99997 в большом Endian, который (2642804992), а затем возвращает ответ в виде длинного значенияПреобразование шестнадцатеричной строки в длинный питон

вот мой код в Python:

v = 99997 
ttm = pack('>i', v) # change the integer to big endian form 
print ("%x"), {ttm} 
r = long(ttm, 16) # convert to long (ERROR) 
return r 

Output: %x set(['\x00\x01\x86\x9d'])

Error: invalid literal for long() with base 16: '\x00\x01\x86\x9d'

Поскольку строка уже в шестнадцатеричной форме, почему она не превращается в длинную? Как я могу удалить эту ошибку и каково решение этой проблемы.

+0

Что вы ожидаете от значения 'r'? – augurar

ответ

1

pack вернет строковое представление данных, которые вы предоставляете.

Строковое представление отличается от базой 16 длинного номера. Перед каждым номером обратите внимание на \ x.

Edit:

попробовать этот

ttm = pack('>I',v) 
final, = unpack('<I',ttm) 
print ttm 

Обратите внимание на использование я, это таким образом, число рассматривается как беззнаковое значение

+0

, так как бы я мог преобразовать эту строку байтов в длинное значение? –

+2

вы можете использовать struct.unpack, как и предлагал @uphill. Вы можете изменить форматирование, используйте '

0

Вы просто преобразуете целочисленное значение в бинарные байты большого конца.

Это полезно в основном вставлять в сообщения, адресованные тупоконечника машины (PowerPC, M68K, ...)

Преобразование в long как это означает разборе ttm строку, которая должна быть 0x1869D в ASCII. (и оператор печати не работает либо BTW)

Если я просто следовать вашей заголовок вопроса: «Преобразование шестнадцатеричной строки в длинный»:

просто использовать long("0x1869D",16). Не нужно сериализовать его. (BTW long работает только в Python 2. В Python 3, вы должны использовать int, так как все числа представлены в виде long)

Ну, я ответив объяснить, почему это обречено на неудачу, но я Редактирую свой ответ, когда я действительно знаю, что вы хотите сделать.

+0

Это странно: ответы опущены, когда они объясняют что-то полезное, и вопрос остается верным (ну, не больше :)), когда это не ясно! –

+0

Да, не знаю, почему downvotes. Оба текущих ответа кажутся мне верными; upvoting. Не мог быть ОП, так как у него не хватило репутации для понижения. –

+0

@ Андрю Чонг: да, не OP! Иногда нам следует воздерживаться от ответа на такие неясные вопросы, даже если мы знаем, почему ОП борется с различными понятиями. Это похоже на репутацию. спасибо BTW –

1

Вы должны использовать struct.unpack в качестве обратной операции до struct.pack.

r, = unpack('<i', ttm) 

это будет r набор для -1652162304.

0

Это хороший вопрос.

Вот что вы ищете.

s = str(ttm) 
for ch in r"\bx'": 
    s = s.replace(ch, '') 

print(int(s, 16)) 

Проблема заключается в том, что ttm похожа на строку в некоторых аспектах. Вот что выглядит: b'\x00\x01\x86\x9d'. Поставка его на int (или long) хранит все символы без шестнадцатеричной формы.Я удалил их, и тогда это сработало.

После удаления не-гекс-значные символы, вы остались с 0001869d, которые действительно 99997

Комментарий Я попробовал его на Python 3. Но на Python 2, это будет почти то же самое, что вы выиграли У меня есть b, прикрепленный к строке, но в остальном это одно и то же.

+0

i try s = str (ttm), но он дал аранту, что utf-8 не может кодировать преобразование байта 0x9d. –

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