python - 读取日志数据的二进制文件并使用 int 输出到新文件(python)

标签 python binary hex binaryfiles hex-file

我一直在开发一个嵌入式软件项目,该项目使用 FATFS 模块将传感器数据写入 SD 卡。数据的数据类型为uint32_t(4字节),输出为二进制文件。

我正在尝试编写一个Python脚本来读取二进制文件(并将数据解析为int并写入新文件)。我当前的代码,

def read():
with open("INPUT1.TXT", "rb") as binary_file:
    # Read the whole file at once
    data = binary_file.read()
    print(data)

这给了我很大的十六进制值,

    b'    \x01   \x02   \x03   \x04   \x05   \x06   \x07   \x08   \t   \n   \x0b   \
x0c   \r   \x0e   \x0f   \x10   \x11   \x12   \x13   \x14   \x15   \x16   \x17
 \x18   \x19   \x1a   \x1b   \x1c   \x1d   \x1e   \x1f       \x01   \x02   \x03
  \x04   \x05   \x06   \x07   \x08   \t   \n   \x0b   \x0c   \r   \x0e   \x0f
\x10   \x11   \x12   \x13   \x14   \x15   \x16   \x17   \x18   \x19   \x1a   \x1
b   \x1c   \x1d   \x1e   \x1f      '

每打印4个字节时,甚至会漏掉一些数字,

f = open("INPUT2.TXT", "rb")
try:
    bytes_read = f.read(4)
    while bytes_read:
        print(bytes_read)
        bytes_read = f.read(4)
finally:
    f.close()

给出结果

b'    '       #supposed to be \x00
b'\x01   '
b'\x02   '
b'\x03   '
b'\x04   '
b'\x05   '
b'\x06   '
b'\x07   '
b'\x08   '
b'\t   '      #supposed to be \x09
b'\n   '      #supposed to be \x0a
b'\x0b   '
b'\x0c   '
b'\r   '      #supposed to be \x0d
b'\x0e   '
b'\x0f   '
b'\x10   '
b'\x11   '
b'\x12   '
b'\x13   '
b'\x14   '
b'\x15   '
b'\x16   '
b'\x17   '
b'\x18   '
b'\x19   '
b'\x1a   '
b'\x1b   '
b'\x1c   '
b'\x1d   '
b'\x1e   '
b'\x1f   '

但是当我在十六进制编辑器中读取二进制文件时,所有二进制文件似乎都是正确的?!

如果我想一次读取4个字节,并写入一个新文件(int类型),我该如何实现?

谢谢

亨利

最佳答案

nums = []
with open("INPUT2.TXT", "rb") as file:
    while byte:
        byte = file.read(4)
        nums.append(int.from_bytes(byte, byteorder="little"))

这应该适用于 python 3。

看起来你的字节与你的示例相反,所以我将字节顺序更改为很小。如果它们没有翻转,则将其改回大。

另一个奇怪的事情:看起来 0x00 变成了 b"",而不是 b"\x00"。如果是这种情况,请改为执行以下操作:

nums = []
with open("INPUT2.TXT", "rb") as file:
    while byte:
        byte = file.read(4)
        nums.append(int.from_bytes(byte.replace(b" ", b"\x00"), byteorder="little"))

这是您提供的示例。

>>> test = [b'    ',
b'\x01   ',
b'\x02   ',
b'\x03   ',
b'\x04   ',
b'\x05   ',
b'\x06   ',
b'\x07   ',
b'\x08   ',
b'\t   ',
b'\n   ',
b'\x0b   ',
b'\x0c   ',
b'\r   ',
b'\x0e   ',
b'\x0f   ',
b'\x10   ',
b'\x11   ',
b'\x12   ',
b'\x13   ',
b'\x14   ',
b'\x15   ',
b'\x16   ',
b'\x17   ',
b'\x18   ',
b'\x19   ',
b'\x1a   ',
b'\x1b   ',
b'\x1c   ',
b'\x1d   ',
b'\x1e   ',
b'\x1f   ']

>>> for t in test:
>>>     print(int.from_bytes(t.replace(b" ", b"\x00"),  byteorder="little"))
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

关于python - 读取日志数据的二进制文件并使用 int 输出到新文件(python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45338280/

相关文章:

python - 如何在多个条件和 groupby 中使用 .loc

c - 输出未知输入的十进制版本

c# - 将十六进制字符串转换为二进制字符串 C#

windows - qt lrelease windows二进制文件?

erlang - 粘合二进制文件(list_to_binary)有多贵?

c# - 如何在 C# 中将数字输出为一串位?

objective-c - 将 NSData 转换为十六进制 NSString

python - 如何检查数组中是否可以求和?

python - Jython将图片转换为灰度,然后取反

Eclipse+PyDev中的Python调试