python - 在 Python 中从二进制文件中读取和解释数据

标签 python binary bitwise-operators

我想逐字节读取文件并检查每个字节的最后一位是否设置:

#!/usr/bin/python

def main():
    fh = open('/tmp/test.txt', 'rb')
    try:
        byte = fh.read(1)
        while byte != "":
            if (int(byte,16) & 0x01) is 0x01:
                print 1
            else:
                print 0
            byte = fh.read(1)
    finally:
        fh.close

    fh.close()

if __name__ == "__main__":
        main()

我得到的错误是:

Traceback (most recent call last):
  File "./mini_01.py", line 21, in <module>
    main()
  File "./mini_01.py", line 10, in main
    if (int(byte,16) & 0x01) is 0x01:
ValueError: invalid literal for int() with base 16: '\xaf'

任何人的想法?我没有成功使用 struct 和 binascii 模块。

最佳答案

尝试使用 bytearray type(Python 2.6 及更高版本),它更适合处理字节数据。您的 try block 将只是:

ba = bytearray(fh.read())
for byte in ba:
    print byte & 1

或创建结果列表:

low_bit_list = [byte & 1 for byte in bytearray(fh.read())]

这是有效的,因为当你索引一个 bytearray 时,你只会得到一个整数 (0-255),而如果你只是从文件中读取一个字节,你会得到一个字符串,所以需要使用 ord将其转换为整数。


如果您的文件太大而无法舒适地保存在内存中(尽管我猜不是),那么 mmap可用于从缓冲区创建 bytearray:

import mmap
m = mmap.mmap(fh.fileno(), 0, access=mmap.ACCESS_READ)
ba = bytearray(m)

关于python - 在 Python 中从二进制文件中读取和解释数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3943149/

相关文章:

python - psycopg2.InternalError : how can I get more useful information?

python - 装饰器不改变 dir()

c - -fwrapv 有什么作用?

java - 如何将二进制字符串转换为使用 UTF-8 编码的 Java 字符串

c - 为什么这里优先使用位运算和乘法而不是条件?

c++ - 使用 AVX2 和范围保存的按位类型转换

Azure 表单识别器边界框结果转换为 XY 坐标

python - 我如何在 python 中将 int16 打包成字节

c++ - 如何在 C++ 中对具有自定义数据类型成员的类进行序列化?

c# - 一次对多个整数应用按位运算符