mieki256's diary



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()));
    }
}

チェックしてみた。オリジナルデータと一致してる。うーん。一体何がおかしいのか。わからん。

以上です。

過去ログ表示

Prev - 2006/07 - Next
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project