以前、「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)
自分なりに色々なサイトで調べてはみたのですが、解決出来ませんでした。
どなたかご助言宜しくお願いします。
渡された文字列を、2文字ずつ切り出して、
1つめ IntToStr('$'+Copy(渡された文字列, 1, 2))
2つめ IntToStr('$'+Copy(渡された文字列, 3, 2))
3つめ IntToStr('$'+Copy(渡された文字列, 5, 2))
4つめ IntToStr('$'+Copy(渡された文字列, 7, 2))
とすればよいかと。
こんな感じです。
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;
およよーかぶってしまいました
あーそうでもないか
私のが間違いです^^;
IntToStrでなく、StrToIntです。
申し訳ない。
それと、メモリかファイルイメージをそのまま文字列にしたらしく、
リトルエンディアンになってますね。すこし、めんくらいました。
にしのさん、jokさん
おかげさまで解決出来ました。
切り出した文字に「'$'」をつけることで、16進数に変換できるのですね。
知りませんでした。
それをByte型の配列に格納し、逆から読む(リトルエンディアン)ことで
Floatに変換できるというわけですね。
すぐに回答を頂いていたのに、お礼が送れてしまい申し訳ありませんでした。
にしのさん、jokさんこのたびはありがとうございました。
ツイート | ![]() |