python读取二进制文件_python读取二进制流 Python二进制方式读写文件 - 电脑常识 - 服务器之家...

python读取二进制流 Python二进制方式读写文件

发布时间:2017-03-18

来源:服务器之家

这两天用Python解析ELF二进制文件,遇到了不少问题,总结整理如下,以便加深对Python的理解。

以二进制读取文件,也就是’rb’格式读取,这个到底如何理解。

其实很简单,以’r’也就是文本读取时,比如读取一个文本文件,其中有个字符串:12345678。以’r’格式读取,那得到的就是串‘12345678’,你可以直接对这个字符串进行操作,这个方式是以用户友好的字符方式显示,你可以对其进行串连接,切片操作。

如果以‘rb’格式读取,那得到的是也是个串,只是这个串中存储的是各个字符的ASCII值。也就是说,存储的是\x31\x32\x33\x34\x35\x36\x37\x38,注意:这里是串中是没有\x的,\x只是表示这个数据是16进制。另外,也不要将31理解成3和1两个字符了,31是0x31是个整体,是一个字符,表示字符1。从这个角度来说,你可以认为它是HEX值流。因为这个串中都是16进制数,所以你要将它当成数来看,用数的操作符号去解析它。比如,将这个串赋值给strHex=’\x31\x32\x33\x34\x35\x36\x37\x38’,len(strHex)=8,注意,不是等于16,原因是显然的,\x31表示一个字符。strHex[0:1]得到的是\x31数字。ord(strHex[0:1])这样是可以的,虽然,strHex[0:1]是个数字,但是从字符的角度来说,它又是字符1,所以ord(strHex[0:1])相当于ord(‘1’),从这个角度可看出,字符和Hex值两个角度互补考虑,对理解二进制还是很有帮助的。

另外,还发现Python还提供了两个类:memoryview和bytearray。Memoryview是只读的,它允许Python代码访问内部对象的内部数据,所以显然要只读了。只是这个对象要支持buffer protocol(不知道是什么东西)。Memoryview有个元素的概念,这个元素是原子性的,由对象来操作。简单的类型如str和bytearray,其元素就是一个字节。但是第三方类型可能元素会大些。所以,可以看出,memoryview其实就是就像str一样,以元素为单位将同类元素组合在一起。只是memoryview可以以对象为参数,比如v=memoryview(‘abcdefg’),这个和字符串没什么区别,但是如果v=memoryview(obj),obj是个对象,那么就得到了对象的内存了。

Memoryview也支持切片操作,返回str类型。

所以,‘r’和‘rb’的区别在于,一个得到的是对用户友好的字符,一个得到的对程序友好的字符的Hex值,在写程序时,要从Hex值和字符两个角度共同思考。

f=open('test.bin','wb')

f.truncate()

s='\x22\x32\xdd\xfd\xab'

data=bytearray('gggggggg')

data[1:4]='\xAA\xBB\xCC'

print len(data)

b='a'

a=memoryview(b)

print a.readonly

v=memoryview('abcdefg')

f.write(s)

f.write(data)

f.close()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值