python中0xf2,关于binaryfiles:Python在获取字节0xa或0xd后停止对文件的二进制读取

我想读取一些二进制文件。 这是一个大文件,因此我使用maximalOffset变量在进入该文件后停止读取。 但是读取总是以一个偏移量-8199结尾。我得到的最后一个字节是0xa。 在xxd中,它是字节0a0d的一部分。

我正在使用Ubuntu 18和Python 3。

我在Windows中找到了有关0x1A的一些信息(它是EOF符号或其他内容),但是解决方案是使用二进制读取,而0xA不是0x1A ...

maximalOffsetString ="2070"

maximalOffset=int(maximalOffsetString,16)

offset=-16 # first 16 bytes must be on 0x0 offset

line = [ ]

pagefile = open("./pagefile","rb")

for bytes in pagefile:

for byte in bytes:

if maximalOffset==offset: break

if len(line) == 16:

print(hex(offset))

print(str(offset)+" :"+str(maximalOffset))

print(line)

del line[:]

line.append(hex(byte))

offset=offset+1

break

pagefile.close()

# here i see what was the last symbols in array:

print(hex(offset))

print(str(offset)+" :"+str(maximalOffset))

print(line)

输出:

0x2007

8199 : 8304

['0xf0', '0xa9', '0xc', '0x7', '0x71', '0xc0', '0xa']

如您所见,我的maximalOffset是8304,但读数停止在8199。在xxd中,此行是:

00002010:f0a9 0c07 71c0 0a0d 0000 006c 0105 5c00

此之前的所有文件均为零。 0x2000之后有随机字节。

00001fb0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

00001fc0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

00001fd0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

00001fe0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

00001ff0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

00002000: 0104 0000 6f01 005c 0094 008c e026 6469  ....o..\.....&di

00002010: f0a9 0c07 71c0 0a0d 0000 006c 0105 5c00  ....q......l..\.

00002020: 9500 8c20 b800 8040 0001 10ab 0c07 4230  ... ...@......B0

00002030: 0dba 0069 010a 5c00 9600 8ce8 b800 38a7  ...i..\.......8.

00002040: 0c07 fbd0 7b01 6601 0f5c 0097 0008 0020  ....{.f..\.....

00002050: 208c f8b8 0090 940d 0724 0000 7a01 6301   ........$..z.c.

00002060: 0c5c 0098 008c 0027 6469 9892 0d07 f2b9  .\.....'di......

00002070: 0009 0080 4100 4100 6001 115c 0099 008c  ....A.A.`..\....

00002080: 08b8 0020 0d0e 072b 7c01 7d01 165c 009a  ... ...+|.}..\..

00002090: 008c 10b8 0028 a20c 0727 bc00 8100 4200  .....(...'....B.

000020a0: 7a01 1b5c 009b 008c 18b9 009f 0d07 29bc  z..\..........).

000020b0: 0077 0118 5c00 9c00 8c98 b803 6091 0d07  .w..\.......`...

000020c0: 06b0 3b05 4000 0103 7401 1d5c 009d 7801  ..;.@...t..\..x.

000020d0: b800 208f 0d07 10f0 097a 0471 0122 5c00  .. ......z.q."\.

您好,您也需要向我们提供二进制文件,以便我们充分了解您的问题。

它是Windows(8 GB)中的bigpagefile.sys。 我可以提供我无法克服的部分。

哦,在那种情况下,没关系:/

因此,读取在00002010处停止,您希望它在哪一行停止?

"但是阅读停止在8199"-8199是什么? 电话号码? 字节数? 字节?

maximalOffsetString =" 2070"-0x2070十六进制偏移。 8199是0x2007的十进制。 它的已处理字节数。 实际上,我可以将其更改为任何更大的偏移量,它将在0x2007处停止。

例如,它可以很好地与填充零的文件配合使用。 我想,对某件事的记忆没有问题。

我认为您在读取完成之前就中断了外部for循环,请删除外部for循环底部的break。

...

for bytes in pagefile:

for byte in bytes:

...

line.append(hex(byte))

offset=offset+1

break #

pagefile.close()

...

有效! 谢谢! 我将其更改为" if maximalOffset == offset:break"以实际中断循环。 但是现在我完全迷失了:我认为" pagefile中的字节"是文件中的所有字节,并且逐字节循环只会在处理完所有字节后才结束。 知道为什么一个二进制文件中有几个"字节"吗?

没问题:),欢迎使用StackOverflow。 一个二进制文件中有几个字节,因为8GB文件对于系统而言无法一次读取所有内容,因此它将读取文件的一部分到内存中,并允许您对其进行处理(内部循环),然后 它将阅读下一部分,覆盖下一部分,依此类推。 这样可以确保仅将最小量的应变存储在内存中。

您可以通过研究Buffer了解更多信息。 上面的评论中描述的过程并不限于Python,它适用于计算机科学的许多不同领域。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值