【问题标题】:How to make binary data as an output?如何将二进制数据作为输出?
【发布时间】:2021-08-23 13:07:39
【问题描述】:

我需要进行 PractRand 测试。它需要:

“PractRand 仅支持对打包二进制数据作为输入进行测试。你不能给它 ASCII 0 和 1 或 ASCII 十六进制或任何每字节没有 8 个随机位的东西。”

http://pracrand.sourceforge.net/Tests_overview.txt

我有 128 位数字,我需要将其导出到这样的另一个程序:

python3 mygenerator.py | ./RNG_test 标准输入

然后 PractRand 可以进行测试。

这个:

binary = bin(number)[2:].zfill(128)
print(binary,end='')

不起作用。这个:

split=[(number >> x) & 0xFFFFFFFF for x in reversed(range(0, 128, 32))]

binary = struct.pack('qqqq', split[0], split[1], split[2], split[3])

print(binary,end='')

不起作用(我正在拆分数字,因为 'q' 格式是 32 位)。甚至可以输出打包的二进制数据,而不是 ASCII 0 和 1 或 ASCII 十六进制或 Python 中每个字节没有 8 个随机位的其他任何东西?我真的怀疑它,虽然我知道它可以用 C++ 完成。

【问题讨论】:

  • 我认为 print 仅适用于字符串数据类型。您是否尝试过使用 sys.stdout ? sys.stdout.write(binary) 我觉得不错
  • @MathisGerma 我有错误:TypeError: write() 参数必须是 str,而不是字节。并且使用“binary = bin(number)[2:].zfill(128)”它仍然无法正常工作。我的意思是生成器在 C++ 中通过了所有测试,在 Python 中没有通过(所以我认为它必须是数据格式的问题,PractRand 将其读取为 ASCII“1”和“0”之类的)。

标签: python binary-data


【解决方案1】:

我认为解决方案在于In this note of python documentation

要从/向标准流写入或读取二进制数据,请使用底层二进制缓冲区对象。例如,要将字节写入标准输出,请使用 sys.stdout.buffer.write(b'abc')

【讨论】:

  • 怎么用?如果我写 sys.stdout.buffer.write(b'binary') 或 sys.stdout.buffer.write(binary) 它仍然不起作用。我的意思是测试仍然失败,所以格式可能又是错误的。
猜你喜欢
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 2014-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多