(编辑版本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中包含的其余文件传递给适当的函数进行处理