リトルエンディアンのバイナリファイルを整数に直すには?


初心者A  2008-10-07 03:39:12  No: 32137

本当のプログラミング初心者です。もし簡単すぎることで質問してしまったら申し訳ありません。
2バイト(16bit)で1ピクセルを表すリトルエンディアン形式のバイナリデータを、delphiで読み取って輝度の整数にしたいのですが、リトルエンディアンの読み取り方がわかりません。
現在、FileStreamを用いて読み出し、1バイトずつ、16進法で
  21 00 27 00 25 00
などのように表示させることはできたのですが、これを0021にして10進法に直すことができないのです。
できればソースを示していただけるとありがたいです。
よろしくお願いします。


そのまんま...  2008-10-07 05:04:05  No: 32138

インテルCPUならばリトルエンディアンなので、
そのまんま Streamから順に WORD型変数に読み込むだけでOK。


初心者A  2008-10-07 20:48:01  No: 32139

返答ありがとうございます。
インテルならば自動的にリトルエンディアンになっているのですね。

現在、取り出したデータをテキスト型に変換して表示させているのですが
どこを変えれば、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;


おやおや?  2008-10-07 21:26:35  No: 32140

どうして「バイト」にコダワルのかなぁ〜(^^ゞ
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;


初心者A  2008-10-07 23:40:57  No: 32141

お早い返事ありがとうございます!!!

動作確認したところ
10進法になって値がでてきました。
親切にありがとうございました。

もしよろしければ質問が一点。
2バイト単位で読み込みというのは自然になっているのはなぜですか?

あと、ある点に着目することはできるのですか?
例えば
30番目の2バイトがどういう値を持っているか
など教えていただけたらありがたいです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加