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;
ほかにもっと効率のよい書き方は無いのかな?
アイデアがある人はコメントください!