标头由 2280 个字节或 0x8e8 个字节组成,如第一个 DIRECTORY 所示
每个项目的长度为 30 字节或 0x1e 字节
所以大约 76 个项目可以放在标题中
项目中的每个最后一个双字表示项目的长度
所以 DIRECTORY 是 0x8e8
TITLE 是 0x80 时间是 0x14
标题可以像这样用 xxd 转储
:\>xxd -s 0 -g30 -c 30 -l 0x8e8 21SIDEB.MMD
0000000: 4449524543544f525900460084d846006936430000014b000100e8080000 DIRECTORY.F...F.i6C...K.......
000001e: 5449544c4500000000000000000000000000000000020100800080000000 TITLE.........................
000003c: 54494d450000000000000000000000000000000000020100140014000000 TIME..........................
000005a: 444154450000000000000000000000000000000000020100140014000000 DATE..........................
0000078: 444154415459504500000000000000000000000000020100140014000000 DATATYPE......................
0000096: 444151000000000000000000000000000000000000020100140014000000 DAQ...........................
00000b4: 504843000000000000000000000000000000000000020100140014000000 PHC...........................
00000d2: 5245434f4e00000000000000000000000000000000020100140014000000 RECON.........................
00000f0: 4445544d41534b0000000000000000000000000000020100140014000000 DETMASK.......................
000010e: 5445524d41534b0000000000000000000000000000020100140014000000 TERMASK.......................
000012c: 4441544d41534b0000000000000000000000000000020100140014000000 DATMASK.......................
000014a: 52454646494c450000000000000000000000000000020100140014000000 REFFILE.......................
0000168: 494e535452554d454e540000000000000000000000020100140014000000 INSTRUMENT....................
0000186: 53455155454e434500000000000000000000000000040100010002000000 SEQUENCE......................
00001a4: 53455249414c000000000000000000000000000000020100140014000000 SERIAL........................
00001c2: 504152544944000000000000000000000000000000020100140014000000 PARTID........................
00001e0: 585354414745000000000000000000000000000000060100010004000000 XSTAGE........................
00001fe: 595354414745000000000000000000000000000000060100010004000000 YSTAGE........................
000021c: 5a5354414745000000000000000000000000000000060100010004000000 ZSTAGE........................
000023a: 544845544153544147450000000000000000000000060100010004000000 THETASTAGE....................
0000258: 5350454349414c5048415345000000000000000000020100140014000000 SPECIALPHASE..................
0000276: 5350454349414c4441544100000000000000000000020100140014000000 SPECIALDATA...................
0000294: 46494c5445524c4142454c00000000000000000000020100140014000000 FILTERLABEL...................
00002b2: 4d41474c4142454c00000000000000000000000000020100140014000000 MAGLABEL......................
00002d0: 43414d4552415f4c4142454c000000000000000000020100140014000000 CAMERA_LABEL..................
00002ee: 545542455f4c4142454c0000000000000000000000020100140014000000 TUBE_LABEL....................
000030c: 58504958454c000000000000000000000000000000060100010004000000 XPIXEL........................
000032a: 59504958454c000000000000000000000000000000060100010004000000 YPIXEL........................
0000348: 5a5343414c45000000000000000000000000000000060100010004000000 ZSCALE........................
0000366: 4f524947494e580000000000000000000000000000040100010002000000 ORIGINX.......................
0000384: 4f524947494e590000000000000000000000000000040100010002000000 ORIGINY.......................
00003a2: 505a54534849465400000000000000000000000000060100010004000000 PZTSHIFT......................
00003c0: 4d4f44544852455348000000000000000000000000060100010004000000 MODTHRESH.....................
00003de: 534d4f4f5448000000000000000000000000000000060100010004000000 SMOOTH........................
00003fc: 424144504958454c00000000000000000000000000060100010004000000 BADPIXEL......................
000041a: 524547494f4e530000000000000000000000000000040100010002000000 REGIONS.......................
0000438: 5445524d0000000000000000000000000000000000020100140014000000 TERM..........................
0000456: 504958454c434f554e540000000000000000000000050100010004000000 PIXELCOUNT....................
0000474: 56414c4c4559000000000000000000000000000000060100010004000000 VALLEY........................
0000492: 5045414b0000000000000000000000000000000000060100010004000000 PEAK..........................
00004b0: 524d53000000000000000000000000000000000000060100010004000000 RMS...........................
00004ce: 524100000000000000000000000000000000000000060100010004000000 RA............................
00004ec: 525300000000000000000000000000000000000000060100010004000000 RS............................
000050a: 435300000000000000000000000000000000000000060100010004000000 CS............................
0000528: 523100000000000000000000000000000000000000060100010004000000 R1............................
0000546: 523200000000000000000000000000000000000000060100010004000000 R2............................
0000564: 413100000000000000000000000000000000000000060100010004000000 A1............................
0000582: 4d45414e0000000000000000000000000000000000060100010004000000 MEAN..........................
00005a0: 5445524d53000000000000000000000000000000000701001c00e0000000 TERMS.........................
00005be: 444154410000000000000000000000000000000000064001400100400600 DATA..................@.@..@..
00005dc: 4d4f44454e414d4500000000000000000000000000020100140014000000 MODENAME......................
00005fa: 545542454e414d4500000000000000000000000000020100140014000000 TUBENAME......................
0000618: 52454c41594e414d45000000000000000000000000020100140014000000 RELAYNAME.....................
0000636: 43414d4552414e414d450000000000000000000000020100140014000000 CAMERANAME....................
0000654: 4f50455241544f5200000000000000000000000000020100140014000000 OPERATOR......................
0000672: 4c4f544e554d424552000000000000000000000000020100140014000000 LOTNUMBER.....................
0000690: 504152544e554d4245520000000000000000000000020100140014000000 PARTNUMBER....................
00006ae: 58444543494d4154494f4e00000000000000000000040100010002000000 XDECIMATION...................
00006cc: 59444543494d4154494f4e00000000000000000000040100010002000000 YDECIMATION...................
00006ea: 46494c544552574156454c454e4754480000000000060100010004000000 FILTERWAVELENGTH..............
0000708: 4f424a4543544956454d4147000000000000000000060100010004000000 OBJECTIVEMAG..................
0000726: 4f424a4543544956454e4100000000000000000000060100010004000000 OBJECTIVENA...................
0000744: 545542454d41470000000000000000000000000000060100010004000000 TUBEMAG.......................
0000762: 52454c41594d414700000000000000000000000000060100010004000000 RELAYMAG......................
0000780: 43414d45524158504958454c000000000000000000060100010004000000 CAMERAXPIXEL..................
000079e: 43414d45524159504958454c000000000000000000060100010004000000 CAMERAYPIXEL..................
00007bc: 000000000000000000000000000000000000000000000000000000000000 ..............................
00007da: 000000000000000000000000000000000000000000000000000000000000 ..............................
00007f8: 000000000000000000000000000000000000000000000000000000000000 ..............................
0000816: 000000000000000000000000000000000000000000000000000000000000 ..............................
0000834: 000000000000000000000000000000000000000000000000000000000000 ..............................
0000852: 000000000000000000000000000000000000000000000000000000000000 ..............................
0000870: 000000000000000000000000000000000000000000000000000000000000 ..............................
000088e: 000000000000000000000000000000000000000000000000000000000000 ..............................
00008ac: 000000000000000000000000000000000000000000000000000000000000 ..............................
00008ca: 000000000000000000000000000000000000000000000000000000000000 ..............................
标题可以这样丢弃
:\>xxd -s 0x8e8 -g16 -l 0x80 21SIDEB.MMD
00008e8: 32312053494445204200736500000000 21 SIDE B.se....
00008f8: 0000000088f61200000000006cf91200 ............l...
0000908: 8f04447eb08e427e7419dd73b825ea73 ..D~..B~t..s.%.s
0000918: 400000000300000044f71200b825ea73 @.......D....%.s
0000928: a825ea73b8f612002cf712000042e673 .%.s....,....B.s
0000938: ffffffff44f7120058f7120004f71200 ....D...X.......
0000948: f27ce273489ceb00fd99eb0090224700 .|.sH........"G.
0000958: 84d8460014d94600d87c420040010000 ..F...F..|B.@...
时间日期和数据类型
:\>xxd -s 0x968 -g16 -l 0x14 21SIDEB.MMD
0000968: 31363a30333a35340000736500000000 16:03:54..se....
0000978: 00000000 ....
:\>xxd -s 0x97c -g16 -l 0x14 21SIDEB.MMD
000097c: 323031372d30372d3131006500000000 2017-07-11.e....
000098c: 00000000 ....
:\>xxd -s 0x990 -g16 -l 0x14 21SIDEB.MMD
0000990: 53555246414345004f4e00004f464600 SURFACE.ON..OFF.
00009a0: 44454255 DEBU
基于此,数据应从 0xc38 开始
>>> import struct
>>> fin = open("21sideb.mmd" ,"rb")
>>> for i in range(0x1a,30*76,30):
... fin.seek(i)
... print "0x%x+" % struct.unpack("i",fin.read(4)),
...
0x8e8+ 0x80+ 0x14+ 0x14+ 0x14+ 0x14+ 0x14+ 0x14+ 0x14+ 0x14+ 0x14+ 0x14+ 0x14+ 0x2+ 0x14+ 0x14+ 0x4+ 0x4+ 0x4+
0x4+ 0x14+ 0x14+ 0x14+ 0x14+ 0x14+ 0x14+ 0x4+ 0x4+ 0x4+ 0x2+ 0x2+ 0x4+ 0x4+ 0x4+ 0x4+ 0x2+ 0x14+ 0x4+ 0x4+ 0x
4+ 0x4+ 0x4+ 0x4+ 0x4+ 0x4+ 0x4+ 0x4+ 0x4+ 0xe0+ 0x64000+ 0x14+ 0x14+ 0x14+ 0x14+ 0x14+ 0x14+ 0x14+ 0x2+ 0x2+
0x4+ 0x4+ 0x4+ 0x4+ 0x4+ 0x4+ 0x4+ 0x0+ 0x0+ 0x0+ 0x0+ 0x0+ 0x0+ 0x0+ 0x0+ 0x0+ 0x0+
>>>
ccalc> 0x8e8 + 0x80的+ 0×14 + 0×14 + 0×14 + 0×14 + 0×14 + 0×14 + 0×14 + 0×14 + 0×14 + 0×14 + 0×14 + 0×2 + 0×14 + 0×14 +为0x4 +为0x4 +为0x4 +为0x4 + 0×14 + 0×14 + 0×14 + 0×14 + 0×14 + 0×14 +为0x4 +为0x4 +为0x4 + 0X2 + 0X2 +为0x4 +为0x4 +为0x4 +为0x4 + 0X2 + 0×14 +为0x4 +为0x4 +为0x4 +为0x4 +为0x4 +为0x4 +为0x4 +为0x4 +为0x4 +为0x4 +为0x4 + 0xe0
答案 = 0x0C38
将文件撕成碎片的python脚本,如标题中所示
import struct
fin = open("21sideb.mmd","rb")
itemaddr = 0
for i in range (0x1a,30*75,30):
fin.seek(i+4)
print str(fin.read(15)),
fin.seek(i)
addone = struct.unpack("i",fin.read(4))
itemaddr += addone[0]; # addr of NEXTITEM
fin.seek(i+30)
addtwo = struct.unpack("i",fin.read(4)) # size of NEXTITEM
fin.seek(itemaddr)
print "size = %s bytes ItemData = %s\n" % ( str(hex(addtwo[0])) , hex(itemaddr))
if(itemaddr != 0xc38):
print struct.unpack( (str(addtwo[0]) + "s"),fin.read(addtwo[0]))
print "\n"
fin.close()
每个项目单独打印
C:\>python carvemmd.py TITLE size = 0x80 bytes ItemData = 0x8e8
('21 SIDE
B\x00se\x00\x00\x00\x00\x00\x00\x00\x00\x88\xf6\x12\x00\x00\x00\x00\x00l
\xf9\x12\x00\x8f\x04D~\xb0\x8eB~t\x19\xdds\xb8%\xeas@\x00\x00\x00\x03\x00
\x00\x00D\xf7\x12\x00\xb8%\xeas\xa8%\xeas\xb8\xf6\x12\x00,\xf7\x12\x00\x00B
\xe6s\xff\xff\xff\xffD\xf7\x12\x00X\xf7\x12\x00\x04\xf7\x12\x00\xf2|\xe2sH
\x9c\xeb\x00\xfd\x99\xeb\x00\x90"G\x00\x84\xd8F\x00\x14\xd9F\x00\xd8|B\x00@
\x01\x00\x00',)
TIME size = 0x14 bytes ItemData = 0x968
('16:03:54\x00\x00se\x00\x00\x00\x00\x00\x00\x00\x00',)
DATE size = 0x14 bytes ItemData = 0x97c
('2017-07-11\x00e\x00\x00\x00\x00\x00\x00\x00\x00',)
DATATYPE size = 0x14 bytes ItemData = 0x990
('SURFACE\x00ON\x00\x00OFF\x00DEBU',)
DAQ size = 0x14 bytes ItemData = 0x9a4
('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00',)
PHC size = 0x14 bytes ItemData = 0x9b8
('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00',)
RECON size = 0x14 bytes ItemData = 0x9cc
('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00',)
DETMASK size = 0x14 bytes ItemData = 0x9e0
('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00',)
TERMASK size = 0x14 bytes ItemData = 0x9f4
('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00',)
DATMASK size = 0x14 bytes ItemData = 0xa08
('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00',)
REFFILE size = 0x14 bytes ItemData = 0xa1c
('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00',)
INSTRUMENT size = 0x14 bytes ItemData = 0xa30
('Smooth Phase\x00\x00\x00\x00\x00\x00\x00\x00',)
SEQUENCE size = 0x2 bytes ItemData = 0xa44
('\x00\x00',)
SERIAL size = 0x14 bytes ItemData = 0xa46
('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00',)
PARTID size = 0x14 bytes ItemData = 0xa5a
('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00',)
XSTAGE size = 0x4 bytes ItemData = 0xa6e
('\x00\x00\x00\x00',)
YSTAGE size = 0x4 bytes ItemData = 0xa72
('\x00\x00\x00\x00',)
ZSTAGE size = 0x4 bytes ItemData = 0xa76
('\x00\x00\x00\x00',)
THETASTAGE size = 0x4 bytes ItemData = 0xa7a
('\x00\x00\x00\x00',)
SPECIALPHASE size = 0x14 bytes ItemData = 0xa7e
('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00',)
SPECIALDATA size = 0x14 bytes ItemData = 0xa92
('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00',)
FILTERLABEL size = 0x14 bytes ItemData = 0xaa6
('520 nm\x00 B\x00se\x00\x00\x00\x00\x00\x00\x00\x00',)
MAGLABEL size = 0x14 bytes ItemData = 0xaba
('20X\x00nm\x00 B\x00se\x00\x00\x00\x00\x00\x00\x00\x00',)
CAMERA_LABEL size = 0x14 bytes ItemData = 0xace
('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00',)
TUBE_LABEL size = 0x14 bytes ItemData = 0xae2
('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00',)
XPIXEL size = 0x4 bytes ItemData = 0xaf6
('H\xe1\xfa>',)
YPIXEL size = 0x4 bytes ItemData = 0xafa
('H\xe1\xfa>',)
ZSCALE size = 0x4 bytes ItemData = 0xafe
('\x00\x00\x80?',)
ORIGINX size = 0x2 bytes ItemData = 0xb02
('\x00\x00',)
ORIGINY size = 0x2 bytes ItemData = 0xb04
('\x00\x00',)
PZTSHIFT size = 0x4 bytes ItemData = 0xb06
('\x00\x00\x00\x00',)
MODTHRESH size = 0x4 bytes ItemData = 0xb0a
('\x00\x00\x00\x00',)
SMOOTH size = 0x4 bytes ItemData = 0xb0e
('\x00\x00\x00\x00',)
BADPIXEL size = 0x4 bytes ItemData = 0xb12
('\xbf\x87*Y',)
REGIONS size = 0x2 bytes ItemData = 0xb16
('\x00\x00',)
TERM size = 0x14 bytes ItemData = 0xb18
('NONE\x00\x00\x00\x00TERMS\x00\x00\x00MEAN',)
PIXELCOUNT size = 0x4 bytes ItemData = 0xb2c
('\x00\x00\x00\x00',)
VALLEY size = 0x4 bytes ItemData = 0xb30
('\x00\x00\x00\x00',)
PEAK size = 0x4 bytes ItemData = 0xb34
('\x00\x00\x00\x00',)
RMS size = 0x4 bytes ItemData = 0xb38
('\x00\x00\x00\x00',)
RA size = 0x4 bytes ItemData = 0xb3c
('\x00\x00\x00\x00',)
RS size = 0x4 bytes ItemData = 0xb40
('\x00\x00\x00\x00',)
CS size = 0x4 bytes ItemData = 0xb44
('\x00\x00\x00\x00',)
R1 size = 0x4 bytes ItemData = 0xb48
('\x00\x00\x00\x00',)
R2 size = 0x4 bytes ItemData = 0xb4c
('\x00\x00\x00\x00',)
A1 size = 0x4 bytes ItemData = 0xb50
('\x00\x00\x00\x00',)
MEAN size = 0x4 bytes ItemData = 0xb54
('\x00\x00\x00\x00',)
TERMS size = 0xe0 bytes ItemData = 0xb58
('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x 00\x00\x00\x00\x00',)
DATA size = 0x64000 bytes ItemData = 0xc38
MODENAME size = 0x14 bytes ItemData = 0x64c38
('Smooth Phase\x00\x00\x00\x00\x00\x00\x00\x00',)
TUBENAME size = 0x14 bytes ItemData = 0x64c4c
('1X Body\x00hase\x00\x00\x00\x00\x00\x00\x00\x00',)
RELAYNAME size = 0x14 bytes ItemData = 0x64c60
('1X Relay\x00ase\x00\x00\x00\x00\x00\x00\x00\x00',)
CAMERANAME size = 0x14 bytes ItemData = 0x64c74
('1/2" CCD\x00ase\x00\x00\x00\x00\x00\x00\x00\x00',)
OPERATOR size = 0x14 bytes ItemData = 0x64c88
('125\x00 CCD\x00ase\x00\x00\x00\x00\x00\x00\x00\x00',)
LOTNUMBER size = 0x14 bytes ItemData = 0x64c9c
('I9W1R\x00CD\x00ase\x00\x00\x00\x00\x00\x00\x00\x00',)
PARTNUMBER size = 0x14 bytes ItemData = 0x64cb0
('39530\x00CD\x00ase\x00\x00\x00\x00\x00\x00\x00\x00',)
XDECIMATION size = 0x2 bytes ItemData = 0x64cc4
('\x01\x00',)
YDECIMATION size = 0x2 bytes ItemData = 0x64cc6
('\x01\x00',)
FILTERWAVELENGT size = 0x4 bytes ItemData = 0x64cc8
('\xb8\x1e\x05?',)
OBJECTIVEMAG size = 0x4 bytes ItemData = 0x64ccc
('\x00\x00\xa0A',)
OBJECTIVENA size = 0x4 bytes ItemData = 0x64cd0
('\xcd\xcc\xcc>',)
TUBEMAG size = 0x4 bytes ItemData = 0x64cd4
('\x00\x00\x80?',)
RELAYMAG size = 0x4 bytes ItemData = 0x64cd8
('\x00\x00\x80?',)
CAMERAXPIXEL size = 0x4 bytes ItemData = 0x64cdc
('\xcd\xcc\x1cA',)
CAMERAYPIXEL size = 0x4 bytes ItemData = 0x64ce0
('\xcd\xcc\x1cA',)
size = 0x0 bytes ItemData = 0x64ce4
('',)
size = 0x0 bytes ItemData = 0x64ce4
('',)
size = 0x0 bytes ItemData = 0x64ce4
('',)
size = 0x0 bytes ItemData = 0x64ce4
('',)
size = 0x0 bytes ItemData = 0x64ce4
('',)
size = 0x0 bytes ItemData = 0x64ce4
('',)
size = 0x0 bytes ItemData = 0x64ce4
('',)
size = 0x0 bytes ItemData = 0x64ce4
('',)
size = 0x0 bytes ItemData = 0x64ce4
('',)
size = 0x0 bytes ItemData = 0x64ce4
('',)
C:\>