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



一行あたりの中の処理を書きます。
   //ここに処理
   for line:=0 to Form1.Memo1.Lines.Count-1 do begin
       //一行あたりの処理
       str:=Form1.Memo1.Lines[line];
       //半角スペースを抜く
       //大文字を小文字にする
       //バイトを抜き出す
       //ファイルに書き込む
   end;
まずはとりあえず1行をstrに入れました。
その後、コメントの処理を実装していきます。
半角スペースを抜く
この処理は、バイナリデータが、
バイナリ1バイト分のテキスト(半角2文字)ずつ半角スペースで
区切ってあるものと仮定し、
あとで扱いやすいようにするためです。
処理するときは、スペースで区切られていない、
A419B1279DD1・・・
とかになるわけです。
逆に、この抜き取る処理をしておけば、
半角スペースで区切って無くても読み込めます。
これ、この前作った置換処理の、
「位置を探す」「削除する」「挿入する」
の3段階の、「位置を探す」と「削除する」だけで作れますね。
pos関数で見つからなくなるまでループして、
見つかるたびにDelete手続きです。
ここで変数が足りなくなりました。
varを書き直します。
var
   line:Integer;
   buf:Byte;
   str:String;
   hsp:Integer;
hspって別に ホットスーププロセッサーじゃないですよ。
HankakuSPace のつもりです。
そしたらコメントの部分にコードを書きましょう。

       //半角スペースを抜く
       while True do begin
           hsp:=pos(' ',str);
           if hsp=0 then break;
           Delete(str,hsp,1);
       end;
while true do begin-end; これは無限ループですね。
条件が正しい間ループ の 条件を、論理値で直接 True を入れています。
pos関数は「第2引数から第1引数を検索し、見つかった文字位置を返す」
でしたね。 str は 今処理すべき1行ですから、
strから' ' を探せ となっています。
' ' は、目には見えないけど半角スペースを挟んでるってことです。
if hsp=0 then break; は
hspが0ならbreak;ですね。 begin-end;の省略をしています。
break;の一つしか処理をしないからです。
hspはposの帰り値を代入してますから、
posは見つからないと0を返すので、
みつからなかったらbreak;ですね。
breakは今のループを抜ける です。
半角スペースをはずす処理のwhileを抜けますが、
forループは抜けないので、次の、小文字にする処理に進みます。
            Delete(str,hsp,1);
ですが、
「第一引数の文字列の第二引数文字目から第3引数バイト削除」
でした。
わかりにくいですね、やっぱし。
この場合、
strのhsp文字目から1バイト です。
現在の処理している行の、半角スペースが見つかった位置から1バイト 削除
ってことです。
1バイトなのは、半角スペースが1バイトだからです。
大文字>小文字は次回