Delphiで16進数の文字列からバイナリストリームを生成する

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;

ほかにもっと効率のよい書き方は無いのかな?

アイデアがある人はコメントください!