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
将为您提供启动过程的 stdout
。 shlex
可以正确解析 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'
我使用
生成了一个十六进制字符串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
将为您提供启动过程的 stdout
。 shlex
可以正确解析 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'