2015-02-09 6 views
-2

Я генерироваться шестнадцатеричной строки, используяPython hex to string?

x = os.system('openssl rand -hex 10') 

Но я хотел бы использовать его в виде строки.

Я пробовал с str(b0f4735701d6325fd072), но он не работает.

также

>>> print(x) 
7a7f13f40aac84332d44 

>>> print("x is of type {}\nx has value {}".format(type(x), x)) 
x is of type <type 'int'> 
x has value 0 
+2

'b0f4735701d6325fd072' не является допустимым идентификатором в Python. У вас есть '0xb0f4735701d6325fd072'? –

+0

На самом деле я делал как x = os.system (openssl rand -hex 10) и сохранял его в файле со строкой конкатенации, но он возвращал 0. – user2858815

ответ

1

Я рекомендую, если вы хотите, чтобы получить это от отдельного процесса, следовать Python передовой практики и использовать subprocess модуль. check_output даст вам stdout процесса, который стартовал. shlex может правильно разобрать команду оболочки для вас, не делать это вручную:

>>> import subprocess 
>>> import shlex 
>>> shlex.split('openssl rand -hex 10') 
['openssl', 'rand', '-hex', '10'] 
>>> x = subprocess.check_output(shlex.split('openssl rand -hex 10')) 
>>> x 
'42bfeea1f5a1d9b96e4b\n' 
>>> x = x.strip() 
>>> x 
'42bfeea1f5a1d9b96e4b' 
>>> int(x, 16) 
315216711282402877075019L 

Чтобы начать с правильным шестнадцатеричной буквальным, который начинается с 0x, которого Python переводит на долгий INT:

>>> 0xb0f4735701d6325fd072 
835645817652699503513714L 

Передайте его hex:

>>> hex(0xb0f4735701d6325fd072) 
'0xb0f4735701d6325fd072L' 

(Вы можете лишить L от строка с hex(0xb0f4735701d6325fd072).strip('L'))

Чтобы преобразовать обратно в длинный из строкового представления, вам нужно передать его int (также long в Python 2) вместе с соответствующим основанием (16 в данном случае):

>>> int('0xb0f4735701d6325fd072', 16) 
835645817652699503513714L 
1

Это вопрос XY, потому что вы не знаете, что делает os.system.

os.system запускает команду оболочки и возвращает код выхода. Вы упомянули, что он возвращает 0, потому что он успешно работал.

Вместо этого вы должны использовать subprocess.check_output.

import subprocess 

hexcode = subprocess.check_output(["openssl", "rand", "-hex", "10"]) 

Это будет возвращать в виде строки вывода вызова оболочки openssl rand -hex 10, а не его код выхода.

+0

Wonderfull !!спасибо приятелю, я где-то смотрел, как выполнить команду оболочки, но это не так, но я не знал, что он возвращает код выхода>. < – user2858815

+1

Вы сделали это одновременно с собой, так что +1. :) –

0

Вы можете получить случайные байты с помощью os.urandom():

>>> import binascii, os 
>>> random_bytes = os.urandom(10) 
>>> random_bytes 
b'\xe4\x19\x9e\xbb\r\xe6C\xaa\x1e\x1f' 
>>> binascii.hexlify(random_bytes) 
b'e4199ebb0de643aa1e1f' 

Если вы хотите, чтобы получить исключение, если PRNG не был отобран с достаточным количеством данных; вы могли бы использовать ssl.RAND_bytes():

>>> import ssl 
>>> ssl.RAND_bytes(10) 
b'\xbdH\xec\xc2+\x03\x1f\x07\xd0R' 

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

>>> import binascii 
>>> import subprocess 
>>> hex_data = subprocess.check_output('openssl rand -hex 10'.split()).strip() 
>>> hex_data 
b'd310f3378f3e93e1f5ca' 
>>> random_bytes = binascii.unhexlify(hex_data) 
>>> random_bytes 
b'\xd3\x10\xf37\x8f>\x93\xe1\xf5\xca'