python list函数遇到null字符_读取python中以Null结尾的字符串

(编辑版本2,在末尾添加了额外的方式)

也许有一些库可以帮助你解决这个问题,但是我不知道他们,让我们用我们所知道的来解决手头的问题。在

在python中,2个字节和string基本上是一样的,python3中string是unicode,bytes是它自己独立的类型,这意味着如果在py2中,就不需要定义read char,因为不需要额外的工作,所以我认为您不需要在这个特殊情况下使用unpack函数,考虑到这一点,让我们定义新的readStringdef readString(myfile):

chars = []

while True:

c = myfile.read(1)

if c == chr(0):

return "".join(chars)

chars.append(c)

就像你的代码一样,我一次只读了一个字符,但我把它们保存在一个列表中,原因是字符串是不可变的,所以str+=char会导致不必要的复制;当我找到空字符时,返回连接字符串。而^{}是^{}的逆,它将给出给定ascii值的字符。这将排除空字符,如果需要,只需移动附加字符。。。在

现在让我们用你的sample file测试它

例如,让我们试着从中读到“剑术假人”

^{pr2}$

这是输出string repr: 'Sword_Wea_Dummy'

string: Sword_Wea_Dummy

rest of the file: '\xcd\xcc\xcc=p=\x8a4:\xa66\xbfJ\x15\xc6=\x00\x00\x00\x00\xeaQ8?\x9e\x8d\x874$-i\xb3\x00\x00\x00\x00\x9b\xc6\xaa2K\x15\xc6=;\xa66?\x00\x00\x00\x00\xb8\x88\xbf@\x0e\xf3\xb1@ITuB\x00\x00\x80?\xcd\xcc\xcc=\x00\x00\x00\x00\xcd\xccL>'

其他试验>>> with open("sword.blendscn","rb") as archi:

print readString(archi)

print readString(archi)

print readString(archi)

sword

Sword_Wea_Dummy

ÍÌÌ=p=Š4:¦6¿JÆ=

>>> with open("sword.blendscn","rb") as archi:

print repr(readString(archi))

print repr(readString(archi))

print repr(readString(archi))

'sword'

'Sword_Wea_Dummy'

'\xcd\xcc\xcc=p=\x8a4:\xa66\xbfJ\x15\xc6='

>>>

现在我考虑一下,您提到数据部分的大小是固定的,如果所有文件都是这样,并且所有文件的结构如下所示[unknow size data][know size data]

然后这是一个我们可以利用的模式,我们只需要知道文件的大小,我们就可以顺利地得到这两个部分如下import os

def getDataPair(filename,knowSize):

size = os.path.getsize(filename)

with open(filename, "rb") as archi:

unknown = archi.read(size-knowSize)

know = archi.read()

return unknown, know

通过知道数据部分的大小,它的使用很简单(我通过前面的例子得到)>>> strins_data, data = getDataPair("sword.blendscn", 80)

>>> string_data, data = getDataPair("sword.blendscn", 80)

>>> string_data

'sword\x00Sword_Wea_Dummy\x00'

>>> data

'\xcd\xcc\xcc=p=\x8a4:\xa66\xbfJ\x15\xc6=\x00\x00\x00\x00\xeaQ8?\x9e\x8d\x874$-i\xb3\x00\x00\x00\x00\x9b\xc6\xaa2K\x15\xc6=;\xa66?\x00\x00\x00\x00\xb8\x88\xbf@\x0e\xf3\xb1@ITuB\x00\x00\x80?\xcd\xcc\xcc=\x00\x00\x00\x00\xcd\xccL>'

>>> string_data.split(chr(0))

['sword', 'Sword_Wea_Dummy', '']

>>>

现在要获得每个字符串,只需简单的拆分就足够了,您可以将data中包含的其余文件传递给适当的函数进行处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值