這幾個晚上(周末除外)都在分解Lingoes-Extractor作者的另外一個工程的代碼, 同樣是用於分析LD2文件的,但僅僅一個java文件就搞定了,對於我這樣的JAVA初學者來說真是'太好了'...
從第一次找到Extractor的代碼起,我就一直很懷疑這位作者要不跟Lingoes有點關系,要不就是一位真正的破解大師...因為Extractor太完美了...代碼不多,卻非常清晰地標記並分解出了LD2的各個段的數據,以及數據間的關系...我的懷疑來自其對ld2文件格式的認識,每一段,每一個字節的意義都非常地准確地標示出來,更神奇的是那些'無從追蹤'的魔數, 例如, 單詞索引間隔固定為10, 14字節的索引數據塊,等等...這些都是怎麼推到出來的啊...
我對自己的懷疑更偏向於後者,因為通過查看作者的其他代碼,其除了分解了ld2文件外,還包括其他多個詞典的數據文件...(感到震驚的同學們,自己去圍觀吧...另,多說一句,googlecode.com是個好地方...)
我並不關心懷疑本身的答案, 因為我已經非常開心 --Extractor終讓我有機會窺視到Lingoes的ld2文件的秘密...
貼段代碼, 以'獎勵'自己多夜的敲敲打打...(是我寫的Java代碼,表認真啊...)
private static void getData(final int index) throws IOException {
RandomAccessFile file = new RandomAccessFile("output.data", "r");
final ByteBuffer buf = ByteBuffer.allocate((int) file.getChannel().size());
file.getChannel().read(buf);
buf.order(ByteOrder.LITTLE_ENDIAN);
int offset = 29;
final int idx[] = new int[6];//
getIndex(buf, offset * 10, idx);
if(idx[5] != idx[1]) {
Output("self xml = " + getXml(buf, idx[1], idx[5] - idx[1]));
}
if(idx[3] == 0) {
Output("word = " + getWord(buf, idx[0], idx[4] - idx[0]));
}
else {
int ref = idx[3];
int offsetword = idx[0];
final int lenword = idx[4] - idx[0];
while(ref -- > 0) {
offset = buf.getInt(lenInflatedWordsIndex + idx[0]);
getIndex(buf, offset * 10, idx);
Output("ref(" + offset + ") xml = " + getXml(buf, idx[1], idx[5] - idx[1]));
offsetword += 4;
}
Output("word = " + getWord(buf, offsetword, lenword));
}
file.close();
}