我正在使用Python(2.7.1 32位和Windows 7 64位)解析二进制STL文件时遇到一些困难。该文件大约有450k大小,但是在解析了约8600个三角形中的244个后,我的解析器突然停止工作,并出现struct.unpack异常:
Exception unpack requires a string argument of length 12
在文件中的光标位置为第33行,第929行。但该行包含约3400个字符,因此这似乎不是换行符问题。
以下是代码:
Exception unpack requires a string argument of length 12
在文件中的光标位置为第33行,第929行。但该行包含约3400个字符,因此这似乎不是换行符问题。
以下是代码:
import struct
normals = []
points = []
triangles = []
bytecount = []
fb = [] # debug list
def unpack (f, sig, l):
s = f.read (l)
fb.append(s)
return struct.unpack(sig, s)
def read_triangle(f):
n = unpack(f,"<3f", 12)
p1 = unpack(f,"<3f", 12)
p2 = unpack(f,"<3f", 12)
p3 = unpack(f,"<3f", 12)
b = unpack(f,"<h", 2)
normals.append(n)
l = len(points)
points.append(p1)
points.append(p2)
points.append(p3)
triangles.append((l, l+1, l+2))
bytecount.append(b[0])
def read_length(f):
length = struct.unpack("@i", f.read(4))
return length[0]
def read_header(f):
f.seek(f.tell()+80)
def write_as_ascii(outfilename):
f = open(outfilename, "w")
f.write ("solid "+outfilename+"\n")
for n in range(len(triangles)):
f.write ("facet normal {} {} {}\n".format(normals[n][0],normals[n][1],normals[n][2]))
f.write ("outer loop\n")
f.write ("vertex {} {} {}\n".format(points[triangles[n][0]][0],points[triangles[n][0]][1],points[triangles[n][0]][2]))
f.write ("vertex {} {} {}\n".format(points[triangles[n][1]][0],points[triangles[n][1]][1],points[triangles[n][1]][2]))
f.write ("vertex {} {} {}\n".format(points[triangles[n][2]][0],points[triangles[n][2]][1],points[triangles[n][2]][2]))
f.write ("endloop\n")
f.write ("endfacet\n")
f.write ("endsolid "+outfilename+"\n")
f.close()
def main():
infilename = r"cupHemis46_28.stl"
outfilename = r"cupHemis46_28_ascii_test.stl"
try:
f = open ( infilename, "r")
read_header(f)
l = read_length(f)
try:
while True:
read_triangle(f)
except Exception, e:
print "Exception",e[0]
print len(normals), len(points), len(triangles), l
write_as_ascii(outfilename)
except Exception, e:
print e
if __name__ == '__main__':
main()
unpack函数(不是来自struct)收集所有将写入文件的字符串。当我比较两个文件时,它们似乎相等,直到unpack停止工作的文件位置。我用Notepad++打开了二进制文件,下一个字符是“SUB”。
我是否没有意识到任何与文件大小或字符限制有关的unpack限制?我的代码有什么问题吗?提前致谢。