You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:39:03