Python 十六进制到字符串?

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

我建议,如果您想从单独的进程中获取它,请遵循 Python 最佳实践并使用 subprocess 模块。 check_output 将为您提供启动过程的 stdoutshlex 可以正确解析 shell 命令,不要手动执行:

>>> 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 转换为 long int:

>>> 0xb0f4735701d6325fd072
835645817652699503513714L

传递给hex:

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

(您可以使用 hex(0xb0f4735701d6325fd072).strip('L') 从字符串中去除 L

要从字符串表示形式转换回 long,您需要将其传递给 int(Python 2 中的 long)以及适当的基数(16 in这种情况):

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

这是一个 XY 问题,因为您不知道 os.system 是做什么的。

os.system 运行 shell 命令和 returns 退出代码。您提到它 returning 0,那是因为它 运行 成功了。

你应该使用 subprocess.check_output.

import subprocess

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

这将 return 作为 shell 调用 openssl rand -hex 10 的输出而不是其退出代码的字符串。

您可以使用 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'