16進数の文字列「932F34E5A890」からバイナリデータを生成する関数を作りました。PHP等からHEXで出力した文字列をバイトストリームに変換します。
コード例
エラー処理はしていないので使う場合は気をつけてください。
OutStreamにMemoryStream、FileStreamなどのインスタンスを渡してください。
procedure HextoBin(HexStr:string; OutStream: TStream);
var
i: Integer;
B1, B2, B: Byte;
s: String;
begin
s := UpperCase(HexStr);
for i := 1 to Length(s) do
begin
if odd(i) then
begin
case s[i] of
'0': B1 := 0;
'1': B1 := 16;
'2': B1 := 32;
'3': B1 := 48;
'4': B1 := 64;
'5': B1 := 80;
'6': B1 := 96;
'7': B1 := 112;
'8': B1 := 128;
'9': B1 := 144;
'A': B1 := 160;
'B': B1 := 176;
'C': B1 := 192;
'D': B1 := 208;
'E': B1 := 224;
'F': B1 := 240;
end;
end
else
begin
case s[i] of
'0': B2 := 0;
'1': B2 := 1;
'2': B2 := 2;
'3': B2 := 3;
'4': B2 := 4;
'5': B2 := 5;
'6': B2 := 6;
'7': B2 := 7;
'8': B2 := 8;
'9': B2 := 9;
'A': B2 := 10;
'B': B2 := 11;
'C': B2 := 12;
'D': B2 := 13;
'E': B2 := 14;
'F': B2 := 15;
end;
B := B2 or B1;
OutStream.Write(B, 1);
end
end;
end;
ほかにもっと効率のよい書き方は無いのかな?
アイデアがある人はコメントください!
![WorkToolSmith [ワークツールスミス]](https://worktoolsmith.com/wp/wp-content/uploads/2014/11/d30716bfc62ca82b12c303b90f356916.png)
