从Python编写真实的原始二进制文件

时间:2019-03-05 08:43:54

标签: python python-3.x numpy binary

我尝试了多种不同的变体,但是由于某些原因,我不断收到无效的二进制数字(人类可读)输出到文件:

img_array = np.asarray(imageio.imread('test.png', as_gray=True), dtype='int8')
img_array.astype('int8').tofile("test.dat")

但这不会产生有效的二进制文件。将文件读入Verilog tb后,它会抱怨无效的二进制数字,当我打开文件时,我看到一堆数字和其他字符。看起来好像翻译不正确。

更新: 跑步后

print(img_array)
print(img_array.tobytes())

我可以看到int值'43'正在被转换为'+',而我期望的是'2B'。似乎只将某些值打印为ASCII。这是一个简单的示例:

x = np.array([[0, 9], [2, 3]], dtype='uint8')
print(x.astype('uint8'))
print(x.tobytes())

输出为:

[[0 9]

[2 3]]

b'\ x00 \ t \ x02 \ x03'

我该如何解决?

任何帮助将不胜感激。

我尝试过的其他解决方案:

Write a “string” as raw binary into a file Python

Write a raw binary file with NumPy array data

2 个答案:

答案 0 :(得分:0)

  

https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.tobytes.html

img_array = np.asarray(imageio.imread('test.png', as_gray=True), dtype='int8')
img_array = img_array.astype('int8')

with open('test.dat', 'wb') as f:
    f.write(img_array.tobytes())

答案 1 :(得分:0)

这提供了一个可行的解决方案,可以转换为十六进制值的字符串。这并不是我想要的,但是由于我的原始问题尚未得到解答,因此它可以解决问题。尽管我找不到此解决方案,所以我可以参考它的来源,但无论如何我都会在这里分享。显然,它也可以处理带符号整数:

@Component({
  selector: 'your-selector',
  templateUrl: './yourtemplate.html',
  styleUrls: ['./yourstyle.css']
})