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())); } }
チェックしてみた。オリジナルデータと一致してる。うーん。一体何がおかしいのか。わからん。
[ ツッコむ ]
以上です。