コラム / バイナリエディタ / 22



バイトを抜き出す部分です。
半角スペースを削除してあるので、2Byteずつ読み込んでいけばよいのですが、
やっぱり変数が欲しくなってきました。
varを書き換えます。
var
   line:Integer;
   buf:Byte;
   str:String;
   hsp:Integer;
   byteStr:String;
byteStrは、バイナリ1バイト分に対応する16進数を入れるための文字列型です。
まぁ、つまり、2バイトしか入れてもらえない運命ですね。
String型は、「可変長」といって、変数のサイズが変わるので、
2バイトだけのために使っても、2ギガバイトのために使っても、
どちらの場合もぴったりなサイズに変わってくれて、
メモリーを無駄遣いしないようになってます。
気にせずガンガン定義しましょうwww
さて、2Byteずつテキストを読み取る部分ですが、
カウンタ変数を使って少しずつ進んでも良いのですが、
「読み込み」「削除」 を繰り返して、
長さが0になるまでループ とやってもできます。
カウンタを使ったループはそろそろ飽きたので、
少し変わった手法でやってみます。
       //バイトを抜き出す
       while Length(str)>0 do begin
           byteStr:=Copy(str,1,2);
           Delete(str,1,2);
           //テキストをバッファに入れる

           //ファイルにバッファを書き込む
       end;
できましたっと。
上で書いてますが、ループの条件は、長さが0になるまで
つまり、「長さが0より大きいならば」 です。
Length() 関数は、引数として与えられた文字列の、
文字数を数えてくれます。
これで、ループするたびに文字数が0より大きいかチェックして、
0になってたら抜けます。
byteStr:=Copy(str,1,2);
ですが、Copyが文字列型を返す関数だ ってことは、
なんとなく気付くと思います。同じようなパターン何度もでてきたし。
Copyは、
「第1引数の文字列の第二引数文字目から第3引数バイトの文字列を返す」
関数です。
やはりわかりにくいですが、
Deleteの削除部分を削除する代わりに引数として返すわけです。
strの1文字目から2バイト取るわけですね。
そして次の行では・・・
Delete(str,1,2);
となっているわけです。もうわかりまっすんね?
Copyと同じ引数の組ですから、Copyでもらった部分を削除してます。
これで、
「strの長さがなくなるまで、
 byteStrに先端の2byteを書き込んでいくループ」
ができました。
最近区切るのが早いなぁwww また会おう