任意の4Byte16進文字列をFloat型に変換するには?

解決


maco  2004-03-20 04:20:08  No: 7783

以前、「4byteの16進文字列をFloatに変換するには?」という質問に対して、
以下のようなサンプルプログラムでの回答がありました。

------------ 回答 ------------

var
    buf: array[0..3] of char;
    f: Single;
    pt: Pointer;
begin
    buf[0] := #$41; //1バイト
    buf[1] := #$E8; //2バイト
    buf[2] := #$B1; //3バイト
    buf[3] := #$56; //4バイト
    f := 0;

    pt := @f;

    PChar(pt)[0] := buf[3];
    PChar(pt)[1] := buf[2];
    PChar(pt)[2] := buf[1];
    PChar(pt)[3] := buf[0];

  return := f;
----------------------------

上記プログラムに任意の文字列を与えることで、
その文字列をFloatに変換する関数として利用したいのですが、
どのようにしたらよいでしょうか?

(関数イメージ)
 3F83A9FC (string) ── 変換関数 ─→ 1.02862501144409 (Float)

自分なりに色々なサイトで調べてはみたのですが、解決出来ませんでした。

どなたかご助言宜しくお願いします。


にしの  2004-03-20 04:48:29  No: 7784

渡された文字列を、2文字ずつ切り出して、
1つめ  IntToStr('$'+Copy(渡された文字列, 1, 2))
2つめ  IntToStr('$'+Copy(渡された文字列, 3, 2))
3つめ  IntToStr('$'+Copy(渡された文字列, 5, 2))
4つめ  IntToStr('$'+Copy(渡された文字列, 7, 2))
とすればよいかと。


jok  2004-03-20 05:03:44  No: 7785

こんな感じです。

function TransToSingle(const Value:string):Single;
var
  b:array[0..3] of Byte;
begin
  b[3] := StrToInt('$'+Copy(Value,1,2));
  b[2] := StrToInt('$'+Copy(Value,3,2));
  b[1] := StrToInt('$'+Copy(Value,5,2));
  b[0] := StrToInt('$'+Copy(Value,7,2));
  Move(b,result,4);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s:string;
  f:single;
begin
  s := '3F83A9FC';
  f := TransToSingle(s);
  Label1.Caption := FloatToStr(f);
end;


jok  2004-03-20 05:04:33  No: 7786

およよーかぶってしまいました


jok  2004-03-20 05:06:13  No: 7787

あーそうでもないか


にしの  2004-03-20 05:15:16  No: 7788

私のが間違いです^^;
IntToStrでなく、StrToIntです。
申し訳ない。


jok  2004-03-20 06:57:27  No: 7789

それと、メモリかファイルイメージをそのまま文字列にしたらしく、
リトルエンディアンになってますね。すこし、めんくらいました。


maco  2004-03-22 18:37:05  No: 7790

にしのさん、jokさん
おかげさまで解決出来ました。

切り出した文字に「'$'」をつけることで、16進数に変換できるのですね。
知りませんでした。

それをByte型の配列に格納し、逆から読む(リトルエンディアン)ことで
Floatに変換できるというわけですね。

すぐに回答を頂いていたのに、お礼が送れてしまい申し訳ありませんでした。
にしのさん、jokさんこのたびはありがとうございました。


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

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






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