本当のプログラミング初心者です。もし簡単すぎることで質問してしまったら申し訳ありません。
2バイト(16bit)で1ピクセルを表すリトルエンディアン形式のバイナリデータを、delphiで読み取って輝度の整数にしたいのですが、リトルエンディアンの読み取り方がわかりません。
現在、FileStreamを用いて読み出し、1バイトずつ、16進法で
21 00 27 00 25 00
などのように表示させることはできたのですが、これを0021にして10進法に直すことができないのです。
できればソースを示していただけるとありがたいです。
よろしくお願いします。
インテルCPUならばリトルエンディアンなので、
そのまんま Streamから順に WORD型変数に読み込むだけでOK。
返答ありがとうございます。
インテルならば自動的にリトルエンディアンになっているのですね。
現在、取り出したデータをテキスト型に変換して表示させているのですが
どこを変えれば、10進法の表記になって表せるのでしょうか。
詰まってしまったため、直し方までわかりません。
よろしければ教えていただきたいです。
procedure TForm1.DumpToText(FileName:string) ;
var
fs:TFileStream ;
bufMemo:TStringList;
buf:array[1..624] of byte;
tmpLine:string;
cnt:integer;
i:integer;
begin
{ if OpenDialog1.Execute then
begin}
//ファイルストリームを開く
fs:=TFileStream.Create('ファイル名',fmOpenRead);
bufMemo:=TStringList.Create;
repeat
//バッファに624バイトずつ読み込む(1列分)
cnt:=fs.Read(buf,624);
tmpLine:='';
{ for i:=1 to cnt do}
for i:=1 to cnt do
begin
//1バイトずつ十六進数な文字列に変換
tmpLine:= tmpLine+IntToHex(buf[i],2)+' '
end;
bufMemo.Append(tmpLine);
until cnt <624;
//表示する
form1.Caption:=fileName;
form1.memo1.Text:=bufMemo.Text;
bufMemo.Free;
//ファイルストリームを閉じる
fs.free;
// end;
end;
どうして「バイト」にコダワルのかなぁ〜(^^ゞ
WORD変数に読み込めって言ってるのに...
var
data, cnt: WORD;
begin
with TFileStream.Create('ファイル名', fmOpenRead) do try
// 2Byte単位で読み込み
// Position := 0;
Memo1.Font.Name := 'MS ゴシック';
while True do begin
cnt := Read(data, Sizeof(data));
if cnt < Sizeof(data) then break;
Memo1.Lines.Add(Format('16進 $%.4x: 10進 %5d', [data, data]));
end;
finally
Free;
end;
end;
お早い返事ありがとうございます!!!
動作確認したところ
10進法になって値がでてきました。
親切にありがとうございました。
もしよろしければ質問が一点。
2バイト単位で読み込みというのは自然になっているのはなぜですか?
あと、ある点に着目することはできるのですか?
例えば
30番目の2バイトがどういう値を持っているか
など教えていただけたらありがたいです。
ツイート | ![]() |