Измените строку из sha256 (). Digest () format на sha256 (). Hexdigest () Python 2.7 [duplicate]

Новый (в 2014 году) tidyr пакет также делает это просто, при этом gather() / spread() является слагаемыми для melt / cast.

library(tidyr)
spread(dat1, key = numbers, value = value)

Из github ,

tidyr - это перерисовка reshape2, предназначенная для сопровождения аккуратной структуры данных и работающая рука об руку с magrittr и dplyr, чтобы построить сплошной конвейер для анализа данных.

Так же, как reshape2 сделал меньше, чем изменение, tidyr делает меньше, чем reshape2. Он разработан специально для сбора данных, а не для общей перестройки, которую делает reshape2, или общего преобразования, которое изменилось. В частности, встроенные методы работают только для кадров данных, а tidyr не содержит полей или агрегации.

blockquote>

111
задан agf 29 September 2011 в 15:16
поделиться

8 ответов

Поскольку Python 3.5, наконец, уже не является неудобным:

>>> b'\xde\xad\xbe\xef'.hex()
'deadbeef'

и reverse:

>>> bytes.fromhex('deadbeef')
b'\xde\xad\xbe\xef'

также работает с изменяемым типом bytearray.

170
ответ дан Felix Weis 22 August 2018 в 14:23
поделиться

его можно использовать спецификатор формата %x02, который форматирует и выводит шестнадцатеричное значение. Например:

>>> foo = b"tC\xfc}\x05i\x8d\x86\x05\xa5\xb4\xd3]Vd\x9cZ\x92~'6"
>>> res = ""
>>> for b in foo:
...     res += "%02x" % b
... 
>>> print(res)
7443fc7d05698d8605a5b4d35d56649c5a927e2736
0
ответ дан Arg0s 22 August 2018 в 14:23
поделиться

Используйте модуль binascii:

>>> import binascii
>>> binascii.hexlify('foo'.encode('utf8'))
b'666f6f'
>>> binascii.unhexlify(_).decode('utf8')
'foo'

См. этот ответ: Python 3.1.1 string to hex

88
ответ дан Community 22 August 2018 в 14:23
поделиться
  • 1
    Это хорошо. Непонятно, что вы можете преобразовать hex в байты с помощью bytes.fromhex (hex_str), но вы не можете преобразовать байты в hex с использованием bytes.tohex () - что в этом рационального? – nagylzs 16 November 2013 в 23:57
  • 2
    Я предполагаю, что отношение между байтами и шестнадцатеричным значением не является свойством либо (которое не отвечает, почему fromhex есть). Похоже, что это был не просто надзор, а то, о чем говорили: bugs.python.org/issue3532#msg70950 . В: Было бы больно иметь метод tohex объекта bytes для выполнения этой задачи? A: ИМО, да, это было бы так. Это усложняет код и отвлекает внимание от правильного подхода к преобразованию данных (а именно, функций, а не методов). – Mu Mind 17 November 2013 в 03:42
  • 3
    Это действительно отвечает на вопрос? Он не возвращает hex str, а bytes. Я знаю, что OP кажется счастливым с ответом, но не будет лучше расширить этот ответ, включив .decode("ascii") также, чтобы преобразовать его в строку & quot; – ecerulm 8 June 2015 в 17:11
  • 4
    Я думал, что многие люди приземляются на этот вопрос / ответ, ища способ распечатать bytes. Если вы print(b'666f6f'), вы получите b в распечатке. Если вы .decode("ascii"), то вы этого не сделаете. Просто подумайте о том, как те, которые на самом деле имели bytes (истинный двоичный код с элементами & gt; 128, а не строку ascii), хотели распечатать его. – ecerulm 9 June 2015 в 05:52
  • 5
    @nagylzs: есть метод .hex() в Python 3.5+ – jfs 24 February 2016 в 16:39

Метод binascii.hexlify() преобразует bytes в bytes, представляющий шестнадцатеричную строку ascii. Это означает, что каждый байт на входе будет преобразован в два символа ascii. Если вы хотите получить истинный str, вы можете .decode("ascii") получить результат.

Я включил фрагмент, который иллюстрирует его.

import binascii

with open("addressbook.bin", "rb") as f: # or any binary file like '/bin/ls'
    in_bytes = f.read()
    print(in_bytes) # b'\n\x16\n\x04'
    hex_bytes = binascii.hexlify(in_bytes) 
    print(hex_bytes) # b'0a160a04' which is twice as long as in_bytes
    hex_str = hex_bytes.decode("ascii")
    print(hex_str) # 0a160a04

из шестнадцатеричной строки "0a160a04" to может вернуться к bytes с binascii.unhexlify("0a160a04"), которая возвращает b'\n\x16\n\x04'

5
ответ дан ecerulm 22 August 2018 в 14:23
поделиться

Python имеет стандартные кодеки с байтами для байтов , которые выполняют удобные преобразования, такие как кавычки для печати (вписываются в 7bits ascii), base64 (вписываются в буквенно-цифровые), hex escaping, gzip и bz2 compression. В Python 2 вы можете сделать:

b'foo'.encode('hex')

В Python 3, str.encode / bytes.decode строго предназначены для преобразований байтов & lt; -> str. Вместо этого вы можете сделать это, которое работает через Python 2 и Python 3 ( s / encode / decode / g для обратного):

import codecs
codecs.getencoder('hex')(b'foo')[0]

Начиная с Python 3.4, существует менее неудобная опция:

codecs.encode(b'foo', 'hex')

Эти кодеки доступны также в своих собственных модулях (base64, zlib, bz2, uu, quopri, binascii); API менее согласован, но для кодеков сжатия он предлагает больше контроля.

32
ответ дан Gabriel 22 August 2018 в 14:23
поделиться
  • 1
    с использованием python 3.3: LookupError: unknown encoding: hex – Janus Troelsen 6 March 2014 в 00:37
  • 2
    @JanusTroelsen: попробуйте 'hex_codec' . Или просто используйте binascii.hexlify(b'foo') напрямую – jfs 18 March 2014 в 10:04

Если вы хотите преобразовать b '\ x61' в 97 или '0x61', вы можете попробовать следующее:

[python3.5]
>>>from struct import *
>>>temp=unpack('B',b'\x61')[0] ## convert bytes to unsigned int
97
>>>hex(temp) ##convert int to string which is hexadecimal expression
'0x61'

Ссылка: https://docs.python.org/ 3,5 / библиотека / struct.html

-1
ответ дан hao li 22 August 2018 в 14:23
поделиться
import codecs
codecs.getencoder('hex_codec')(b'foo')[0]

работает в Python 3.3 (так что «hex_codec» вместо «hex»).

7
ответ дан Infinite Recursion 22 August 2018 в 14:23
поделиться
  • 1
    Возможно, интересно, что в Python 3.4 "hex" или "hex_codec" работает отлично. – Stephen Paulger 24 December 2014 в 10:08

ОК, следующий ответ немного за пределами области видимости, если вы только заботитесь о Python 3, но этот вопрос является первым хитом Google, даже если вы не указали версию Python, так что это способ, который работает как на Python 2 и Python 3.

Я также интерпретирую вопрос о преобразовании байтов в тип str: байты на Python 2 и Unicode- y на Python 3.

Учитывая, что лучший подход, который я знаю, это:

import six

bytes_to_hex_str = lambda b: ' '.join('%02x' % i for i in six.iterbytes(b))

Следующее утверждение будет верно для Python 2 или Python 3, предполагая, t активировал будущее unicode_literals в Python 2:

assert bytes_to_hex_str(b'jkl') == '6a 6b 6c'

(Или вы можете использовать ''.join(), чтобы опустить пробел между байтами и т. д.)

1
ответ дан Peter 22 August 2018 в 14:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: