我正在处理一个输出大小非常重要的项目。由于我的输出是0到100之间的数字,我试图将它们写为字节(或无符号字符)。
但是,我在尝试阅读时遇到错误。
这是一个简单的例子:
test_filename='test.b'
g=(3*ones(shape=[1000])).astype('c')
g.tofile(test_filename)
with open(test_filename, "rb") as f:
bytes = f.read(1)
num = int(bytes.encode('hex'), 1)
print num
这是我得到的错误,不知何故,bytes.encode thingy除了二进制字符串或类似的东西(当然不确定):
ValueError Traceback (most recent call last)
<ipython-input-43-310a447041fe> in <module>()
----> 1 num = int(bytes.encode('hex'), 1)
2 print num
ValueError: int() base must be >= 2 and <= 36
我应该说我以后需要用C ++读取输出文件。
提前致谢,
吉尔
答案 0 :(得分:0)
根据您使用的python版本,这有一些不确定性。
如果python2,我假设你因为print语句而使用,那么你遇到的主要问题是你从读取中得到一个字符串,所以如果值为50,你会得到一个ascii值为2你打印它。你需要告诉python这些位应该是int类型而不是str类型,而简单的转换不能这样做。
我个人会使用struct包并执行以下操作:
with open(test_filename, "rb") as f:
bytes = f.read(1)
num = struct.unpack("B", bytes)[0]
print num
另一个选择是将字符串编码为十六进制并将其作为十六进制字符串读取(看起来就像你正在尝试的那样):
num = int(bytes.encode("hex_codec"), 16))
print num
最后一个选项是将字符串放在bytearray中并拉出第一个字节:
num = bytearray(bytes)[0]
print num
如果你实际上正在使用python 3,这更简单,因为你将获得一个字节对象(如果是这样,不要命名一个变量字节,非常混乱)。使用bytes对象,您可以将第一个元素拉出来,将其作为int:
拉出num = bytes[0]
print num