如何在Python中输出满足PractRand要求的打包二进制数据
Python输出PractRand兼容原始二进制流的实现方案
PractRand要求输入为逐字节8位的原始打包二进制数据,Python完全可以实现该需求,你之前的写法存在两处核心错误,修正后即可正常使用:
- 第一版写法将整数转为ASCII格式的0/1字符串,每个0/1字符单独占1字节,属于文本数据,不符合二进制输入要求
- 第二版写法存在两个问题:一是格式符
q对应64位有符号整数,你按32位拆分后用4个q打包实际输出256位数据,长度不符合要求;二是print函数默认工作在文本模式,输出bytes会自动做转义/编码转换,无法输出原始二进制内容
最优实现方案(推荐)
直接调用Python整数内置的to_bytes方法转原始二进制,再写入stdout的二进制缓冲区即可:
import sys # 循环生成128位随机数并输出,适配PractRand的流式输入要求 while True: # 替换为你自己的128位随机数生成逻辑 number = your_128bit_random_generator() # length=16对应128位,byteorder可选'little'(小端)或'big'(大端),保持一致即可 raw_binary = number.to_bytes(length=16, byteorder='little', signed=False) # 直接写入stdout的二进制缓冲区,输出原始二进制 sys.stdout.buffer.write(raw_binary)
可选struct实现方案
如果你更倾向用struct拆分打包,正确写法如下:
import sys import struct while True: number = your_128bit_random_generator() # 按32位无符号整数拆分 split = [(number >> x) & 0xFFFFFFFF for x in range(0, 128, 32)] # <IIII表示小端序4个32位无符号整数,总长度128位 raw_binary = struct.pack('<IIII', *split) sys.stdout.buffer.write(raw_binary)
修改完成后直接用你的管道命令即可正常测试:python3 mygenerator.py | ./RNG_test stdin
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

