這幾個(gè)晚上(周末除外)都在分解
Lingoes-Extractor作者的另外一個(gè)工程的代碼, 同樣是用于分析LD2文件的,但僅僅一個(gè)java文件就搞定了,對(duì)于我這樣的JAVA初學(xué)者來說真是'太好了'...
從第一次找到Extractor的代碼起,我就一直很懷疑這位作者要不跟Lingoes有點(diǎn)關(guān)系,要不就是一位真正的破解大師...因?yàn)镋xtractor太完美了...代碼不多,卻非常清晰地標(biāo)記并分解出了LD2的各個(gè)段的數(shù)據(jù),以及數(shù)據(jù)間的關(guān)系...我的懷疑來自其對(duì)ld2文件格式的認(rèn)識(shí),每一段,每一個(gè)字節(jié)的意義都非常地準(zhǔn)確地標(biāo)示出來,更神奇的是那些'無從追蹤'的魔數(shù), 例如, 單詞索引間隔固定為10, 14字節(jié)的索引數(shù)據(jù)塊,等等...這些都是怎么推到出來的啊...
我對(duì)自己的懷疑更偏向于后者,因?yàn)橥ㄟ^查看作者的其他代碼,其除了分解了ld2文件外,還包括其他多個(gè)詞典的數(shù)據(jù)文件...(感到震驚的同學(xué)們,自己去圍觀吧...另,多說一句,googlecode.com是個(gè)好地方...)
我并不關(guān)心懷疑本身的答案, 因?yàn)槲乙呀?jīng)非常開心 --Extractor終讓我有機(jī)會(huì)窺視到Lingoes的ld2文件的秘密...
貼段代碼, 以'獎(jiǎng)勵(lì)'自己多夜的敲敲打打...(是我寫的Java代碼,表認(rèn)真啊...)
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();
}
再整理幾天,要能琢磨個(gè)LAC2直接使用ld2的法子來的話,那就又可以進(jìn)一大步了啊...