我想将/ dev / random中的输出字节连接到我在程序中生成的字符串。但这给了我错误:
'ascii' codec can't decode byte 0xd9 in position 2: ordinal not in range(128)
所以我将dev / random输出转换为unicode
unicode(s, errors='ignore')
但是如果/ dev / random的输出发生了很多(long),那么这又会失败,因为它与unicode值不匹配。截至目前,我正在使用
从dev / random读取42个字节open("/dev/random","rb").read(42)
但这可以是任意数量的字节。什么是连接这些值的安全方法,以便程序不会因任何值而失败。
答案 0 :(得分:2)
这比访问" / dev / random"更容易。直接
>>> import os
>>> os.urandom(42)
b'\xb1\xc5"_>\x18\xdc\xb7\x0f\xc0\x86\x15\x00&\xc2S\x94\xf3\x10eT\xc5<\xbf3\x99\xd6\xa8\x06\xa3\x8fh@E7\xde8&k\xcd9\xcd'
如果你真的需要使用/ dev / random(可以阻止),请查看os.py
,你会发现:
if not _exists("urandom"):
def urandom(n):
"""urandom(n) -> str
Return a string of n random bytes suitable for cryptographic use.
"""
try:
_urandomfd = open("/dev/urandom", O_RDONLY)
except (OSError, IOError):
raise NotImplementedError("/dev/urandom (or equivalent) not found")
try:
bs = b""
while n - len(bs) >= 1:
bs += read(_urandomfd, n - len(bs))
finally:
close(_urandomfd)
return bs
请注意,因为这位于os.py
- open
,read
,close
和O_RDONLY
为os.open
,os.read
,os.close
和os.O_RDONLY
。
如果你替换&#34; urandom&#34; - &GT; &#34;随机&#34;,您将获得使用&#34; / dev / random&#34; - 并且/ dev / random是exausted时阻塞。
答案 1 :(得分:0)
要将随机字节字符串转换为Unicode,您可以使用'latin-1'
编码将n
- 字节转换为n
- Unicode代码点:
>>> bytearray(range(0x100)).decode('latin-1')
'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\...'