变量类型
表达式及语法
特殊属性
<format=hex|decimal|octal|binary,
fgcolor=<color>,
bgcolor=<color>,
comment="<string>"|<function_name>,
name="<string>"|<function_name>,
open=true|false|suppress,
hidden=true|false,
read=<function_name>,
write=<function_name>,
size=<number>|<function_name>>
搜集资料
定义结构
#define IMAGE_ARCHIVE_START_SIZE 8
#define IMAGE_ARCHIVE_START "!<arch>\n"
#define IMAGE_ARCHIVE_LINKER_MEMBER "/ "
#define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// "
typedef struct _ARCHIVE_START
{
char StartStr[IMAGE_ARCHIVE_START_SIZE];
}ARCHIVE_START;
typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
BYTE Name[16];
BYTE Date[12];
BYTE UserID[6];
BYTE GroupID[6];
BYTE Mode[8];
BYTE Size[10];
BYTE EndHeader[2];
}IMAGE_ARCHIVE_MEMBER_HEADER;
typedef struct _MEMBERDATA(ULONG Size)
{
UCHAR Data[Size];
}MEMBERDATA;
简单解析模板
#define IMAGE_ARCHIVE_START_SIZE 8
#define IMAGE_ARCHIVE_START "!<arch>\n"
#define IMAGE_ARCHIVE_LINKER_MEMBER "/ "
#define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// "
typedef struct _ARCHIVE_START
{
char StartStr[IMAGE_ARCHIVE_START_SIZE];
}ARCHIVE_START;
typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
BYTE Name[16];
BYTE Date[12];
BYTE UserID[6];
BYTE GroupID[6];
BYTE Mode[8];
BYTE Size[10];
BYTE EndHeader[2];
}IMAGE_ARCHIVE_MEMBER_HEADER;
typedef struct _MEMBERDATA(ULONG Size)
{
UCHAR Data[Size];
}MEMBERDATA;
//--------------------------------------
LittleEndian();
ARCHIVE_START Start;
IMAGE_ARCHIVE_MEMBER_HEADER FirstLinker;
if(ReadByte(FTell() + Atoi(FirstLinker.Size)) == 10)
{
MEMBERDATA Data(Atoi(FirstLinker.Size) + 1);
}
else
{
MEMBERDATA Data(Atoi(FirstLinker.Size));
}
IMAGE_ARCHIVE_MEMBER_HEADER SecondLinker;
if(ReadByte(FTell() + Atoi(SecondLinker.Size)) == 10)
{
MEMBERDATA Data(Atoi(SecondLinker.Size) + 1);
}
else
{
MEMBERDATA Data(Atoi(SecondLinker.Size));
}
IMAGE_ARCHIVE_MEMBER_HEADER LongNames;
if(ReadByte(FTell() + Atoi(LongNames.Size)) == 10)
{
MEMBERDATA Data(Atoi(LongNames.Size) + 1);
}
else
{
MEMBERDATA Data(Atoi(LongNames.Size));
}
完整解析模板
#define IMAGE_ARCHIVE_START_SIZE 8
#define IMAGE_ARCHIVE_START "!<arch>\n"
#define IMAGE_ARCHIVE_LINKER_MEMBER "/ "
#define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// "
typedef struct _ARCHIVE_START
{
char StartStr[IMAGE_ARCHIVE_START_SIZE];
}ARCHIVE_START;
typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
BYTE Name[16];
BYTE Date[12];
BYTE UserID[6];
BYTE GroupID[6];
BYTE Mode[8];
BYTE Size[10];
BYTE EndHeader[2];
}IMAGE_ARCHIVE_MEMBER_HEADER;
typedef struct _MEMBERDATA(ULONG Size)
{
UCHAR Data[Size];
}MEMBERDATA;
typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER_OBJ(int i) {
local int index <hidden=true>;
index = i;
BYTE Name[16];
BYTE Date[12];
BYTE UserID[6];
BYTE GroupID[6];
BYTE Mode[8];
BYTE Size[10];
BYTE EndHeader[2];
}IMAGE_ARCHIVE_MEMBER_HEADER_OBJ <comment=GetFullObjName,read=GetObjName>;
typedef struct _ALLOBJS
{
local int i <hidden=true>;
i = 0;
while(!FEof())
{
IMAGE_ARCHIVE_MEMBER_HEADER_OBJ ObjMember(i++);
if(FTell() + Atoi(ObjMember.Size) >= FileSize())
{
MEMBERDATA Data(Atoi(ObjMember.Size));
break;
}
if(ReadByte(FTell() + Atoi(ObjMember.Size)) == 10)
{
MEMBERDATA Data(Atoi(ObjMember.Size) + 1);
}
else
{
MEMBERDATA Data(Atoi(ObjMember.Size));
}
}
}ALLOBJS;
string GetFullObjName(IMAGE_ARCHIVE_MEMBER_HEADER_OBJ& MemberHeader)
{
local int j <hidden=true>;
j = 0;
local int NameOffset <hidden=true>;
NameOffset = LongNameBase;
while(j++ < MemberHeader.index)
{
NameOffset += Strlen(ReadString(NameOffset)) + 1;
}
return ReadString(NameOffset);
}
string GetObjName(IMAGE_ARCHIVE_MEMBER_HEADER_OBJ& MemberHeader)
{
local int j <hidden=true>;
j = 0;
local int k <hidden=true>;
k = 0;
local int NameOffset <hidden=true>;
NameOffset = LongNameBase;
local int start <hidden=true>;
start = 0;
while(j++ < MemberHeader.index)
{
NameOffset += Strlen(ReadString(NameOffset)) + 1;
}
for(start = NameOffset + Strlen(ReadString(NameOffset));start >= NameOffset;start--)
{
if(ReadByte(start) == '\\')
{
break;
}
}
return ReadString(start + 1);
}
//--------------------------------------
LittleEndian();
local int LongNameBase <hidden=true>;
ARCHIVE_START Start;
IMAGE_ARCHIVE_MEMBER_HEADER FirstLinker;
if(ReadByte(FTell() + Atoi(FirstLinker.Size)) == 10)
{
MEMBERDATA Data(Atoi(FirstLinker.Size) + 1);
}
else
{
MEMBERDATA Data(Atoi(FirstLinker.Size));
}
IMAGE_ARCHIVE_MEMBER_HEADER SecondLinker;
if(ReadByte(FTell() + Atoi(SecondLinker.Size)) == 10)
{
MEMBERDATA Data(Atoi(SecondLinker.Size) + 1);
}
else
{
MEMBERDATA Data(Atoi(SecondLinker.Size));
}
IMAGE_ARCHIVE_MEMBER_HEADER LongNames;
LongNameBase = FTell();
if(ReadByte(FTell() + Atoi(LongNames.Size)) == 10)
{
MEMBERDATA Data(Atoi(LongNames.Size) + 1);
}
else
{
MEMBERDATA Data(Atoi(LongNames.Size));
}
ALLOBJS Object;
http://www.sweetscape.com/010editor/manual/
https://bbs.pediy.com/thread-115877.htm
看雪ID:21Gun5
https://bbs.pediy.com/user-868592.htm
推荐文章++++
好书推荐