emwin.py
· 2.4 KiB · Python
Исходник
#!/usr/bin/env python
import time
from zipfile import ZipFile
numfiles = 20
c = 0
def parseEMWINHeader(data):
if not data[0] == '/':
print "Invalid Header: %s" % data[:80]
return False
head = data[:80]
filename = head[1:15]
partNumber = head[18:24]
partTotal = head[27:33]
cs = head[36:43]
dateTime = head[46:]
return {
"filename": filename,
"partNumber": int(partNumber),
"partTotal": int(partTotal),
"cs": int(cs),
"dateTime": dateTime
}
def findSyncMarker(data):
found = False
pos = -1
for i in range(len(data)-13):
t = True
for z in range(13):
if z == 12:
if not data[i+z] == '/':
t = False
break
else:
if not ord(data[i+z]) == 0x00:
t = False
break
if t:
pos = i
break
return pos
buff = ""
files = {}
while True:
if c == numfiles:
break
f = open("%s_0.emwin" % c, "rb")
data = f.read()
f.close()
c += 1
buff += data
pos = findSyncMarker(buff)
if pos == -1:
print "Marker not found"
continue
buff = buff[pos:]
if len(buff) < 1116:
#print "Not yet enough data"
continue
data = buff[pos:pos+1116]
buff = buff[pos+1116:]
data = data[12:]
if len(data) > 0:
header = parseEMWINHeader(data)
if header != False:
data = data[80:]
filename = header["filename"]
partNumber = header["partNumber"]
partTotal = header["partTotal"]
print "Received %s/%s of %s" %(header["partNumber"], header["partTotal"], header["filename"])
if partNumber == 1:
tstamp = int(round(time.time()))
outFile = "%s-%s" %(tstamp, filename)
files[filename] = { "parts": partTotal, "received": 0, "output": outFile }
if not filename in files:
print "Received incomplete file %s" %filename
elif files[filename]["received"] + 1 != partNumber:
print "Missed %s frames for file %s" %(partNumber + 1 - partNumber, filename)
else:
f = open("%s" %files[filename]["output"], "wb" if partNumber == 1 else "ab")
f.write(data)
f.close()
files[filename]["received"] += 1
if partNumber == partTotal and filename in files:
print "Finished file %s" %filename
if ".ZIS" in filename:
f = ZipFile(files[filename]["output"], "r")
f.extractall()
files.pop(filename, None)
| 1 | #!/usr/bin/env python |
| 2 | |
| 3 | import time |
| 4 | from zipfile import ZipFile |
| 5 | |
| 6 | numfiles = 20 |
| 7 | c = 0 |
| 8 | |
| 9 | def parseEMWINHeader(data): |
| 10 | |
| 11 | if not data[0] == '/': |
| 12 | print "Invalid Header: %s" % data[:80] |
| 13 | return False |
| 14 | |
| 15 | head = data[:80] |
| 16 | filename = head[1:15] |
| 17 | partNumber = head[18:24] |
| 18 | partTotal = head[27:33] |
| 19 | cs = head[36:43] |
| 20 | dateTime = head[46:] |
| 21 | |
| 22 | return { |
| 23 | "filename": filename, |
| 24 | "partNumber": int(partNumber), |
| 25 | "partTotal": int(partTotal), |
| 26 | "cs": int(cs), |
| 27 | "dateTime": dateTime |
| 28 | } |
| 29 | |
| 30 | def findSyncMarker(data): |
| 31 | found = False |
| 32 | pos = -1 |
| 33 | for i in range(len(data)-13): |
| 34 | t = True |
| 35 | for z in range(13): |
| 36 | if z == 12: |
| 37 | if not data[i+z] == '/': |
| 38 | t = False |
| 39 | break |
| 40 | else: |
| 41 | if not ord(data[i+z]) == 0x00: |
| 42 | t = False |
| 43 | break |
| 44 | if t: |
| 45 | pos = i |
| 46 | break |
| 47 | return pos |
| 48 | |
| 49 | buff = "" |
| 50 | |
| 51 | files = {} |
| 52 | |
| 53 | while True: |
| 54 | if c == numfiles: |
| 55 | break |
| 56 | f = open("%s_0.emwin" % c, "rb") |
| 57 | data = f.read() |
| 58 | f.close() |
| 59 | c += 1 |
| 60 | buff += data |
| 61 | pos = findSyncMarker(buff) |
| 62 | if pos == -1: |
| 63 | print "Marker not found" |
| 64 | continue |
| 65 | |
| 66 | buff = buff[pos:] |
| 67 | |
| 68 | if len(buff) < 1116: |
| 69 | #print "Not yet enough data" |
| 70 | continue |
| 71 | |
| 72 | data = buff[pos:pos+1116] |
| 73 | buff = buff[pos+1116:] |
| 74 | data = data[12:] |
| 75 | if len(data) > 0: |
| 76 | header = parseEMWINHeader(data) |
| 77 | if header != False: |
| 78 | data = data[80:] |
| 79 | filename = header["filename"] |
| 80 | partNumber = header["partNumber"] |
| 81 | partTotal = header["partTotal"] |
| 82 | print "Received %s/%s of %s" %(header["partNumber"], header["partTotal"], header["filename"]) |
| 83 | if partNumber == 1: |
| 84 | tstamp = int(round(time.time())) |
| 85 | outFile = "%s-%s" %(tstamp, filename) |
| 86 | files[filename] = { "parts": partTotal, "received": 0, "output": outFile } |
| 87 | |
| 88 | if not filename in files: |
| 89 | print "Received incomplete file %s" %filename |
| 90 | elif files[filename]["received"] + 1 != partNumber: |
| 91 | print "Missed %s frames for file %s" %(partNumber + 1 - partNumber, filename) |
| 92 | else: |
| 93 | f = open("%s" %files[filename]["output"], "wb" if partNumber == 1 else "ab") |
| 94 | f.write(data) |
| 95 | f.close() |
| 96 | files[filename]["received"] += 1 |
| 97 | if partNumber == partTotal and filename in files: |
| 98 | print "Finished file %s" %filename |
| 99 | if ".ZIS" in filename: |
| 100 | f = ZipFile(files[filename]["output"], "r") |
| 101 | f.extractall() |
| 102 | files.pop(filename, None) |
| 103 |