2006/07/04(火) [n年前の日記]
#3 [iappli] 結合データがオリジナルデータと合ってるかどうかを確認するプログラムを作成
SO902iでサウンドがスクラッチパッドから読み込めない問題を調査中。Perlで結合していることで、結合データ中の一部がおかしくなってるのかな、と不安になったので、チェックするプログラムは Java で作成。ファイル名を取得するあたりでちとハマる。出来上がってからふと気づく。考えてみれば、String[] として持ってしまって良かったのかもしれん。どうせ使い捨てのプログラムなんだし。
こんな感じになった。
チェックしてみた。オリジナルデータと一致してる。うーん。一体何がおかしいのか。わからん。
こんな感じになった。
import java.io.File;
import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Comparator;
/*
* サウンド用 .res の内容と、.mld の内容を比較する
*/
public class CheckResCoherent implements FilenameFilter {
/**
* @param args mld格納フォルダ res格納フォルダ
*/
public static void main(String[] args) {
// 引数の数が合ってなかったら使い方を表示
if (args.length != 2) {
usage();
return;
}
// ファイル情報取得
File[] filesMld = new File(args[0]).listFiles(new CheckResCoherent());
File[] filesRes = new File(args[1]).listFiles(new CheckResCoherent());
// ファイル名でソート
Arrays.sort(filesMld, new NameComparator());
Arrays.sort(filesRes, new NameComparator());
// 念のためにファイル名一覧を表示
for (int i = 0; i < filesMld.length; i++) {
System.out.println(filesMld[i].getPath());
}
// 念のためにファイル名一覧を表示。ついでに総サイズも取得
int resSize = 0;
for (int i = 0; i < filesRes.length; i++) {
System.out.println(filesRes[i].getPath());
resSize += filesRes[i].length();
}
// 結合データを読み込む
int cnt = 0;
byte[] buf = new byte[resSize];
InputStream in = null;
for (int i = 0; i < filesRes.length; i++) {
try {
in = new FileInputStream(filesRes[i].getPath());
int ch;
while ((ch = in.read()) != -1) {
buf[cnt] = (byte) (ch & 0x0ff);
cnt++;
}
} catch (IOException e) {
System.out.println(e);
} finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e) {
}
}
}
System.out.println(cnt + " byte ... res total size");
// 結合データのヘッダ部分から、格納されてるファイル数等を取得
int ofs = 0;
int fnum = getShort(buf, ofs);
System.out.println("file num = " + fnum);
ofs += 2;
int cksum = getShort(buf, ofs);
System.out.println("Checksum = " + cksum);
ofs += 2;
int fsize = getInt(buf, ofs);
System.out.println("file size = " + fsize);
ofs += 4;
// 1ファイルずつチェック
for (int i = 0; i < fnum; i++) {
// データ種類取得
int datakind = buf[ofs];
ofs += 1;
// オフセット取得
int dofs = getInt(buf, ofs);
ofs += 4;
// サイズ取得
int dlen = getInt(buf, ofs);
ofs += 4;
// オリジナルの mld データを読み込む
long osize = filesMld[i].length();
if (osize != dlen) {
System.out.println("Error:" + i + "\tファイルサイズが一致しません。 orgsize=" + osize + " ressize=" + dlen);
return;
}
byte[] ob = new byte[(int) osize];
int cn = 0;
try {
in = new FileInputStream(filesMld[i].getPath());
int ch;
while ((ch = in.read()) != -1) {
ob[cn] = (byte) (ch & 0x0ff);
cn++;
}
} catch (IOException e) {
System.out.println(e);
} finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e) {
}
}
// 結合データの中身と、オリジナル mld を、1byteずつ比較
int fg = -1;
for (int n = 0; n < ob.length; n++) {
if (ob[n] != buf[dofs + n]) {
fg = n;
break;
}
// System.out.println(n);
}
if (fg >= 0) {
System.out.println("Error:" + i + "\tデータが一致しません。\toffset=" + fg);
return;
}
System.out.println("kind=" + datakind + "\toffset=" + dofs + "\tlength=" + dlen + " : check OK " + i);
}
}
// 一応、使い方を説明
static void usage() {
final String[] mes = {
"サウンド用 .res の内容と、.mld の内容を比較します。", //
"usage : java MLD_DIR RES_DIR", //
};
for (int i = 0; i < mes.length; i++) {
System.out.println(mes[i]);
}
}
// 特定拡張子のファイル名だけを取り出す
public boolean accept(File dir, String name) {
if (name.endsWith(".mld") || name.endsWith(".res")) return true;
return false;
}
// byte[] から short を取得
static int getShort(byte[] b, int offset) {
return (((b[offset] << 8) & 0x0ff00) | (b[offset + 1] & 0x00ff));
}
// byte[] から int を取得
static int getInt(byte[] b, int offset) {
return (((b[offset] << 24) & 0x0ff000000) | ((b[offset + 1] << 16) & 0x0ff0000) | ((b[offset + 2] << 8) & 0x0ff00) | (b[offset + 3] & 0x00ff));
}
}
// ソート用
class NameComparator implements Comparator {
public int compare(Object o1, Object o2) {
File f1 = (File) o1;
File f2 = (File) o2;
return (f1.getName().compareTo(f2.getName()));
}
}
チェックしてみた。オリジナルデータと一致してる。うーん。一体何がおかしいのか。わからん。
[ ツッコむ ]
以上です。