バイナリ読み込みファンクション群

ず〜っと整理しないままに書きなぐっているといつの間にか数千行にまで及んでしまったので今更ながらにコードの整理を行っております。今回スプリットオフしたのはバイナリデータの読み込みに関するファンクションたちです。バイナリと言っても8ビット、16ビット、32ビットと長さによって扱いも変わります。おまけに符号の有無やFixedPointなんかもあったりと煩わしさ倍増なのです。この部分を整理して外に放り出してみたりしました。オマケとして文字コード関連の処理系も含めています。unicode→SJISテーブルは以前のQRコード用の外部テーブルを改変して利用しています。でも83kBもの変換テーブルを利用している時点で負けなのかもw

こちらがコードです。

function readLongDt(targetFile){
    var result=0;
    var a = 72057594037927936;
    for(var k=0;k<8;k++){
        result += targetFile.readch().charCodeAt(0) * a;
        a /= 256;
        }
    return result;
    }

function readULong(targetFile){
    var result=0;
    var a = 16777216;
    for(var k=0;k<4;k++){
        result += targetFile.readch().charCodeAt(0) * a;
        a /= 256;
        }
    return result;
    }

function readLong(targetFile){
    var result=0;
    var a = 16777216;
    for(var k=0;k<4;k++){
        result += targetFile.readch().charCodeAt(0) * a;
        a /= 256;
        }
    if (result>2147483648) result -= 4294967296;
    return result;
    }

function readUShort(targetFile){
    var result = targetFile.readch().charCodeAt(0) * 256;
    result += targetFile.readch().charCodeAt(0);
    return result;
    }

function readShort(targetFile){    
    var d = targetFile.readch().charCodeAt(0);
    var result = d << 8;
    result += targetFile.readch().charCodeAt(0);
    if (result>32768) result -= 65536;
    return result;
    }

function readFixed(targetFile){
    var result = “0x”;
    var d;
    for (var i=0;i<4;i++){
        d = targetFile.readch().charCodeAt(0).toString (16);
        if (d.length==1) d = “0” + d;
        result += d;
        }
    return result;
    }

function readFxd16(targetFile){
    var result = readShort(targetFile) + “.”;
    result += readShort(targetFile);
    return Number(result);

    }

function readFxd2d14(targetFile){
    var result = “”;
    var d = readShort(targetFile);
    result = d >> 14;
    if (result>2) result -= 4;
    result += (d & 0x3fff) / 16384;
    return result;
    }

function readUnit24(targetFile){
    var result = targetFile.readch().charCodeAt(0) * 65536;
    result += targetFile.readch().charCodeAt(0) * 256;
    result += targetFile.readch().charCodeAt(0);
    return result
    }

function winBMP(tg,ofst,len){
    var byt = 0;
    var st = “”;
    for (var i=0;i<len/2;i++){
        byt = tg.readch().charCodeAt(0) * 256;
        st += String.fromCharCode(byt+tg.readch().charCodeAt(0));
        }
    return st;
    }

function u2sj_init(){
    var text = new Array ();
    fileRef = new File (“~/desktop/fontAnalisys/u2sj.tbl”);
    if (fileRef.open(‘r’)){
        while (!fileRef.eof) {
            tmp = fileRef.readln();
            text = tmp.split(‘\t’);
            sjisCd[Number(text[1])] = Number(text[0]);
            }
        }
    }

function u2sj(tg,ofst,len){
    tg.seek(ofst);
    st=””;
    a=””;
    b=0;
    for (i=0;i<len;i++){
        a = tg.readch().charCodeAt (0);
        if (a>0x80){
            a *= 256;
            b = a + tg.readch().charCodeAt (0);
            a = sjisCd[b];
            i++;
            }
        st += String.fromCharCode (a);
        }
    return st;
    }

function readBytes(targetFile){
    var a = targetFile.readch().charCodeAt (0);
    var dat = a << 8;
    a = targetFile.readch().charCodeAt (0);
    dat += a;
    return dat
    }

基本はbyte読み込みが出来るreadch()メソッドです。繰り返し読み込んで重みつけてあとは足し算ですのでそう複雑な部分はありません。しかし、signedの物は符号処理にご注意下さい。
一番長い物で64bit長のデータを処理する必要があります。
重み付けとか処理にバリエーションが存在しますが、気分的な物です。処理時間等に影響を及ぼす部分はありません。それとu2sj.tblファイルの配置にもご留意下さい。
次回はメインのルーチンをお届けします。

u2sj.tbl.zip

ten_a

Graphic Designer, Scripter and Coder. Adobe Community Professional.

シェアする

1件のコメント

  1. Fixed 2dot14の実装を完了してませんでした。返り値が全然合わないので焦ったw
    ごめんね
    正しくは以下。
    function readFxd2d14(targetFile){
    var result = “”;
    var d = readShort(targetFile);
    result = d >> 14;
    if (result>2) result -= 4;
    result += (d & 0x3fff) / 16384;
    return result;
    }
    本文も訂正済み

ten へ返信する コメントをキャンセル