python读二进制文件遍历_使用python反向读取二进制文件

从这个问题中我可以看出代码中有几点需要改进。首先,while循环在Python中很少使用,因为使用for循环或使用一些内置函数几乎总是有更好的方法来表达相同的内容。在

我想代码纯粹是为了培训目的。否则,我会首先问真正的目标是什么(因为知道了问题,更好的解决方案可能与第一个想法大不相同)。在

这里的目标是获得seek的位置。你知道大小,你知道块大小,你想倒退。Python中有一个内置的生成器,名为range。通常使用单个参数;但是,range(start, stop, step)是完整形式。生成器可以在for循环中迭代,也可以使用say值构建它们的列表(但通常不需要后面的情况)。seek的位置可以这样生成:chunk = 10

sz = 235

lst = list(range(sz - chunk, 0, -chunk))

print(lst)

也就是说,从sz - chunk位置开始,在零处停止(不经常),使用下一个生成值的负值。在这里,list()遍历所有值并构建它们的列表。但可以直接迭代生成的值:

^{pr2}$

最后生成的位置是或零或正。这样,当最后一个if比chunk短时,它处理最后一个部分。将上述代码组合在一起,它将打印:c:\tmp\_Python\wikicsm\so16443185>py a.py

[225, 215, 205, 195, 185, 175, 165, 155, 145, 135, 125, 115, 105, 95,

85, 75, 65, 55, 45, 35, 25, 15, 5]

seek(225) and read(10)

seek(215) and read(10)

seek(205) and read(10)

seek(195) and read(10)

seek(185) and read(10)

seek(175) and read(10)

seek(165) and read(10)

seek(155) and read(10)

seek(145) and read(10)

seek(135) and read(10)

seek(125) and read(10)

seek(115) and read(10)

seek(105) and read(10)

seek(95) and read(10)

seek(85) and read(10)

seek(75) and read(10)

seek(65) and read(10)

seek(55) and read(10)

seek(45) and read(10)

seek(35) and read(10)

seek(25) and read(10)

seek(15) and read(10)

seek(5) and read(10)

seek(0) and read(5)

我个人会通过调用接受file对象pos和块大小的函数来替换print。在这里伪造的尸体产生了相同的指纹:#!python3

import os

def processChunk(f, pos, chunk_size):

print('faked f: seek({}) and read({})'.format(pos, chunk_size))

fname = 'a.txt'

sz = os.path.getsize(fname) # not checking existence for simplicity

chunk = 16

with open(fname, 'rb') as f:

for pos in range(sz - chunk, 0, -chunk):

processChunk(f, pos, chunk)

if pos > 0:

processChunk(f, 0, pos)

with结构是另一个值得学习的结构。(警告,与Pascal的with)它在块结束后自动关闭file对象。请注意,with下面的代码更具可读性,以后不需要更改。将进一步开发processChunk:def processChunk(f, pos, chunk_size):

f.seek(pos)

s = binascii.hexlify(f.read(chunk_size))

print(s)

或者您可以稍微更改它,使其结果是一个反向hextump(在我的计算机上测试的完整代码):#!python3

import binascii

import os

def processChunk(f, pos, chunk_size):

f.seek(pos)

b = f.read(chunk_size)

b1 = b[:8] # first 8 bytes

b2 = b[8:] # the rest

s1 = ' '.join('{:02x}'.format(x) for x in b1)

s2 = ' '.join('{:02x}'.format(x) for x in b2)

print('{:08x}:'.format(pos), s1, '|', s2)

fname = 'a.txt'

sz = os.path.getsize(fname) # not checking existence for simplicity

chunk = 16

with open(fname, 'rb') as f:

for pos in range(sz - chunk, 0, -chunk):

processChunk(f, pos, chunk)

if pos > 0:

processChunk(f, 0, pos)

当a.txt是最后一个代码的副本时,它将生成:c:\tmp\_Python\wikicsm\so16443185>py d.py

00000274: 75 6e 6b 28 66 2c 20 30 | 2c 20 70 6f 73 29 0d 0a

00000264: 20 20 20 20 20 20 20 70 | 72 6f 63 65 73 73 43 68

00000254: 20 20 69 66 20 70 6f 73 | 20 3e 20 30 3a 0d 0a 20

00000244: 6f 73 2c 20 63 68 75 6e | 6b 29 0d 0a 0d 0a 20 20

00000234: 72 6f 63 65 73 73 43 68 | 75 6e 6b 28 66 2c 20 70

00000224: 75 6e 6b 29 3a 0d 0a 20 | 20 20 20 20 20 20 20 70

00000214: 20 2d 20 63 68 75 6e 6b | 2c 20 30 2c 20 2d 63 68

00000204: 20 70 6f 73 20 69 6e 20 | 72 61 6e 67 65 28 73 7a

000001f4: 61 73 20 66 3a 0d 0a 0d | 0a 20 20 20 20 66 6f 72

000001e4: 65 6e 28 66 6e 61 6d 65 | 2c 20 27 72 62 27 29 20

000001d4: 20 3d 20 31 36 0d 0a 0d | 0a 77 69 74 68 20 6f 70

000001c4: 69 6d 70 6c 69 63 69 74 | 79 0d 0a 63 68 75 6e 6b

000001b4: 20 65 78 69 73 74 65 6e | 63 65 20 66 6f 72 20 73

000001a4: 20 20 23 20 6e 6f 74 20 | 63 68 65 63 6b 69 6e 67

00000194: 65 74 73 69 7a 65 28 66 | 6e 61 6d 65 29 20 20 20

00000184: 0d 0a 73 7a 20 3d 20 6f | 73 2e 70 61 74 68 2e 67

00000174: 0a 66 6e 61 6d 65 20 3d | 20 27 61 2e 74 78 74 27

00000164: 31 2c 20 27 7c 27 2c 20 | 73 32 29 0d 0a 0d 0a 0d

00000154: 27 2e 66 6f 72 6d 61 74 | 28 70 6f 73 29 2c 20 73

00000144: 20 20 70 72 69 6e 74 28 | 27 7b 3a 30 38 78 7d 3a

00000134: 66 6f 72 20 78 20 69 6e | 20 62 32 29 0d 0a 20 20

00000124: 30 32 78 7d 27 2e 66 6f | 72 6d 61 74 28 78 29 20

00000114: 32 20 3d 20 27 20 27 2e | 6a 6f 69 6e 28 27 7b 3a

00000104: 20 78 20 69 6e 20 62 31 | 29 0d 0a 20 20 20 20 73

000000f4: 7d 27 2e 66 6f 72 6d 61 | 74 28 78 29 20 66 6f 72

000000e4: 20 27 20 27 2e 6a 6f 69 | 6e 28 27 7b 3a 30 32 78

000000d4: 65 20 72 65 73 74 0d 0a | 20 20 20 20 73 31 20 3d

000000c4: 20 20 20 20 20 20 20 20 | 20 20 20 20 23 20 74 68

000000b4: 62 32 20 3d 20 62 5b 38 | 3a 5d 20 20 20 20 20 20

000000a4: 73 74 20 38 20 62 79 74 | 65 73 0d 0a 20 20 20 20

00000094: 20 20 20 20 20 20 20 20 | 20 20 20 23 20 66 69 72

00000084: 31 20 3d 20 62 5b 3a 38 | 5d 20 20 20 20 20 20 20

00000074: 75 6e 6b 5f 73 69 7a 65 | 29 0d 0a 20 20 20 20 62

00000064: 20 20 20 62 20 3d 20 66 | 2e 72 65 61 64 28 63 68

00000054: 20 20 66 2e 73 65 65 6b | 28 70 6f 73 29 0d 0a 20

00000044: 63 68 75 6e 6b 5f 73 69 | 7a 65 29 3a 0d 0a 20 20

00000034: 73 73 43 68 75 6e 6b 28 | 66 2c 20 70 6f 73 2c 20

00000024: 20 6f 73 0d 0a 0d 0a 64 | 65 66 20 70 72 6f 63 65

00000014: 62 69 6e 61 73 63 69 69 | 0d 0a 69 6d 70 6f 72 74

00000004: 74 68 6f 6e 33 0d 0a 0d | 0a 69 6d 70 6f 72 74 20

00000000: 23 21 70 79 |

对于src_file_path = 'd:\\src\\python\\test\\main.zip',也可以在Windows中使用类似src_file_path = 'd:/src/python/test/main.zip'的正斜杠。或者您可以使用原始字符串,比如src_file_path=r'd:\src\python\test\主.zip'. 最后一种情况是当您需要避免在编写常规表达式时经常使用反斜杠。在

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue 在已有的购买列表中(数据库返回的数据)修改商品数量

连续加班一个月 连续通宵三天 到最后还是少了一个功能 心碎 简介:一个生成好的商品列表(数据库返回的数据) 首先拿到我们需要渲染的数组 在data中定义 我是在测试的时候 直接写了两条数据 下面开始点击删除 点击添加是一样的代码 只不过加号…

python饼状图教程_Python数据可视化:饼状图的实例讲解

使用python实现论文里面的饼状图:原图:python代码实现:# # 饼状图# plot.figure(figsize(8,8))labels [uCanteen, uSupermarket, uDorm, uOthers]sizes [73, 21, 4, 2]colors [red, yellow, blue, green]explode (0.05, 0, 0, 0)patches,…

小看--单例设计模式

(一)单例设计描述 只要了解过设计模式的同学都会知道:单例设计模式,大家都知道单例设计模式是一种创建行的设计模式。既然是创建型,那么先来讲讲,对象的创建的过程吧。 --静态成员:静态成员在程…

动态方法注入 grails_Grails动态下拉菜单

动态方法注入 grails最近,我有一个UI要求,客户希望从两个单独的下拉列表中选择值。 第一个下拉列表的值实质上过滤了第二个下拉列表的值。 鉴于我们支持的财务项目对UI的要求并不严格,因此我不得不进行一些初步的学习和试验,以实现…

selenium原理python_从python角度解析selenium原理

1、selenium工作流程2、selenium工作原理(1)客户端和服务端之间实际是通过http协议进行通信,服务端的接口文档可参考:https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#sessionsessionidelement(2)客户端按照服务端接口要求传入请求方式、…

Jmeter(二)Jmeter目录介绍

看过许多有关Jmeter的博客,算得上的收获颇丰;不过最牛逼的博客还是“官方文档”,官方文档是ApacheJmeter自己对自己产品的说明,论起对自己产品的理解程度,那肯定是自己嘛。。。因此推荐大家从Jmeter的官方文档开始学习…

使用Spring Data MongoDB和Spring Boot进行数据聚合

MongoDB聚合框架旨在对文档进行分组并将其转换为聚合结果。 聚合查询包括定义将在管道中执行的几个阶段。 如果您对有关该框架的更深入的细节感兴趣,那么 mongodb docs是一个很好的起点。 这篇文章的重点是编写一个用于查询mongodb的Web应用程序,以便从…

结合前段修改mysql表数据_jquery实现点击文字可编辑并修改保存至数据库

这个方法网上可以查到很多,但是好多只有点击文字编辑并保持,但是没有完整的代码写怎么保存到数据库。因为本人才疏学浅,费啦好长时间才写好把修改的内容只用一条sql语句保存到数据库,今天在这里和大家分享这是运行图片这是前台页面…

关于类、抽象类和接口的继承关系

关于类、抽象类和接口的继承关系 Java类的继承是单继承的,就是一个类只能继承一个类,但是可以通过接口来实现多继承,一个类可以实现多个接口。通过这种方式,Java类就可以实现多继承的关系。但是在继承类和实现接口的时候&#xff…

js符号转码_JS 文字符串转换unicode编码函数

AJAX传递中文字符串时必须把中文字符串编码成unicode,一般会用到JS的自带函数escape().不过找到了更好的函数来确决中文字符转换成unicode编码的函数function uniencode(text){text escape(text.toString()).replace(/\/g, "%2B");var matches text.match(/(%([0-9…

ASP.NET Core 2.0 MVC 发布部署--------- ASP.NET Core 发布的具体操作

ASP.NET Core 发布的具体操作 下面使用C# 编写的ASP.NET Core Web项目示例说明发布的全过程。 1、创建项目 选择“文件” > “新建” > “项目”。 在“添加新项目”对话框中,在“已安装” “Visaul C#” “Web” 项目类型窗格中选择“ASP.NET Core Web 应用…

jsf集成spring_Spring和JSF集成:国际化和本地化

jsf集成spring如果您正在开发针对多种语言的JSF应用程序&#xff0c;那么您可能很熟悉<f&#xff1a;loadBundle>标记。 即使您的应用程序不支持使用消息捆绑包进行国际化仍然是一个好主意。 在<f&#xff1a;loadBundle>标签的作用下&#xff0c;它从Java java.ut…

java 设置两个方法互斥_分享两个操作Java枚举的实用方法

1. 前言Java枚举在开发中是非常实用的。今天再来分析几个小技巧并且回答一些同学的的疑问。首先要说明的是我的枚举建立在以下的范式之中&#xff1a;枚举统一接口范式2. 如何把枚举值绑定的下拉列表这种场景非常常见&#xff0c;如果你把状态、类别等属性封装成枚举的结构&…

微信小程序正确的异步request请求,根据经纬度获取地理位置信息

微信小程序的所有request请求都是异步的&#xff0c;不支持同步。但是在请求时可能会耗费一定时间&#xff0c;这样的话在获取返回数据时可能方法还没有执行完就已经进行赋值操作了。我遇到的就是拿到的数据为undefined。 解决办法&#xff0c;使用回调函数&#xff0c;等操作完…

Spring管理的交易说明-第2部分(JPA)

在本系列的第一部分中 &#xff0c;我展示了事务如何在普通JDBC中工作 。 然后&#xff0c;我展示了Spring如何管理基于JDBC的事务。 在本系列的第二部分中&#xff0c;我将首先展示事务如何在普通的JPA中工作。 然后展示Spring如何管理基于JPA的事务。 资金转移 为了帮助说明…

oracle_sqlserver和mysql获取表外键的方法_mysql、sqlserver、oracle三种数据库维护索引、外键、字段语法总结...

mysql、sqlserver、oracle三种数据库维护索引、外键、字段语法总结1. MYSQL数据库1) 创建索引CREATE INDEX index_name ON table_name(column_list)CREATE UNIQUE INDEX index_name ON table_name(column_list)修改表的方式添加索引ALTER TABLE table_name ADD INDEX in…

CCC数字钥匙设计【BLE】--车主配对之BLE OOB配对

本文主要介绍CCC3.0采用BLE进行车主配对时&#xff0c;关于蓝牙OOB配对的内容。 首先&#xff0c;介绍下BLE Pairing的一些基础知识&#xff0c;有一些基本概念。之后&#xff0c;再着重介绍CCC规范定义的BLE OOB配对流程。 1、BLE Pairing基础知识 下面先简单介绍下BLE 5.0协…

mysql 重置密码模式_mysql--重置密码

解决Mysql忘记密码&#xff1a;1、首先停止正在运行的MySQL进程&#xff1a;[rootcml5 ~]# systemctl stop mysqld2、以安全模式启动MySQL&#xff1a;[rootcml5 ~]# /usr/local/mysql/bin/mysqld_safe--skip-grant-tables &##或者在my.cnf文件下添加&#xff0c;执行完后就…

Java EE 8中的MVC 1.0:使用Facelets入门

MVC 1.0是一个基于动作的Model-View-Controller Web框架&#xff0c;它将成为将来的Java EE 8的一部分。它将与基于组件的JSF框架并存&#xff0c;并提供构建面向HTML javascript的应用程序的替代方法完全控制网址。 这篇文章总结了使用Facelets代替默认的JSP作为MVC框架的视…

Linux 查看内存状态

# 查看系统内存 命令&#xff1a;free 注&#xff1a;默认k单位显示注&#xff1a;-m 以MB注&#xff1a;-g以GB 单位显示total used free shared buffers cached Mem: 497 463 33 0 13 124 -/ buffe…