【问题标题】:bytes casted to int by a list constructor由列表构造函数转换为 int 的字节
【发布时间】:2017-01-13 06:03:12
【问题描述】:

我想读取 n 个字节的二进制文件并将每个字节存储在一个列表中。但是,当我这样做时,每个字节都会被转换为int

首先我创建一个随机文件。

$ head -c 16 > random.file

然后我尝试阅读它:

>>> with open('random.file', 'rb') as fp:
...     l = list(fp.read(8))
...     print(fp.read(8))
... 
b'@\xc2\xdf\x9f\xbbv\xa1\x90'
>>> l
[79, 233, 19, 116, 252, 50, 248, 144]
>>> type(l[0])
<class 'int'>

所以我知道我的字节值不能超过 255 但是 Python 自动转换的事实导致了问题,因为没有得到预期的类型。

这正常吗?我怎样才能避免这种情况?

【问题讨论】:

  • 我不认为 Python 正在转换任何东西。解释器只是显示字节数组的十进制值
  • 单字节bytes 对象列表的意义何在?你真的需要那个吗?可能不支持,因为它是一个罕见的用例......
  • 您的预期输出究竟是什么?

标签: python types casting


【解决方案1】:

您在字节列表中访问的任何单个字节都只是一个 int 值:

>>> b"foo"[0]
102

如果您想创建一个由长度为 1 的字节列表组成的新列表,您必须明确地这样做:

>>> c = b"foo"
>>> l = []
>>> for i in range(0, len(c)):
...   l.append(c[i:i+1])
>>> l
[b'f', b'o', b'o']

但我不确定我是否有任何理由这样做,因为访问现在嵌入在新列表中的单个值只会再次返回一个 int。

【讨论】:

  • 嗯,我认为你是对的。我的用例是在文件上有一个滑动窗口,所以我在文件的进展过程中在右侧添加一个字节并在左侧删除一个字节。
猜你喜欢
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 2016-03-04
  • 2016-02-20
相关资源
最近更新 更多