バイトを抜き出す部分です。
半角スペースを削除してあるので、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 また会おう
コンテンツ
最新の12件
2023-06-12
2021-02-15
2013-06-19
2012-07-14
2012-02-04
2012-01-06
2011-03-31
2010-08-26
2010-03-15
2009-10-21
2009-02-12
2008-11-18
メニュー編集
- counter: 761
- today: 1
- yesterday: 0
- online: 1