【问题标题】:Hex to Binary convert十六进制转二进制
【发布时间】:2012-03-24 18:30:20
【问题描述】:

我已通过十六进制转换器将我的 jpeg 文件转换为十六进制代码。

现在如何将该十六进制转换为二进制并在磁盘上保存为Jpeg 文件。

喜欢:

var 声明为十六进制代码,然后将该 var 十六进制代码转换为二进制并保存在磁盘上?

编辑:

Var 
  myfileHex := 'FAA4F4AAA444444'; // long as HEX code of my JPEG 

function HexToBin(myfileHex): string;
begin    
  // Convert Hex to bin and save file as...
end; 

【问题讨论】:

  • 你的问题不清楚。示例将非常有帮助。您使用的是什么“十六进制转换器”?所述转换器的输出是什么样的?
  • 二进制文件到十六进制编码的 Ascii 文件链接csoft.co.uk/hex_converter/index.htm
  • 转换为十六进制字符串真的很奇怪。我想不出你会这样做的任何理由。你有什么误会吗?

标签: delphi delphi-7


【解决方案1】:

Delphi 已经有HexToBin (Classes) 程序,至少从 D5 开始。
试试这个代码:

procedure HexStringToBin;
var
  BinaryStream: TMemoryStream;
  HexStr: AnsiString;
begin
  HexStr := 'FAA4F4AAA44444';
  BinaryStream := TMemoryStream.Create;
  try
    BinaryStream.Size := Length(HexStr) div 2;
    if BinaryStream.Size > 0 then
    begin
      HexToBin(PAnsiChar(HexStr), BinaryStream.Memory, BinaryStream.Size);
      BinaryStream.SaveToFile('c:\myfile.bin')
    end;
  finally
    BinaryStream.Free;
  end;
end;

任何二进制文件TStream 都可以这样做,例如TFileStream.

【讨论】:

    【解决方案2】:

    Hex 很容易手动解码:

    procedure HexToBin(const Hex: string; Stream: TStream);
    var
      B: Byte;
      C: Char;
      Idx, Len: Integer;
    begin
      Len := Length(Hex);
      If Len = 0 then Exit;
      If (Len mod 2) <> 0 then raise Exception.Create('bad hex length');
      Idx := 1;
      repeat
        C := Hex[Idx];
        case C of
          '0'..'9': B := Byte((Ord(C) - '0') shl 4);
          'A'..'F': B := Byte(((Ord(C) - 'A') + 10) shl 4);
          'a'..'f': B := Byte(((Ord(C) - 'a') + 10) shl 4);
        else
          raise Exception.Create('bad hex data'); 
        end; 
        C := Hex[Idx+1];
        case C of
          '0'..'9': B := B or Byte(Ord(C) - '0');
          'A'..'F': B := B or Byte((Ord(C) - 'A') + 10);
          'a'..'f': B := B or Byte((Ord(C) - 'a') + 10);
        else
          raise Exception.Create('bad hex data'); 
        end; 
        Stream.WriteBuffer(B, 1);
        Inc(Idx, 2);
      until Idx > Len;
    end;
    
    begin
      FStream := TFileStream.Create('myfile.jpg', fmCreate);
      HexToBin(myFileHex, FStream);
      FStream.Free;
    end;
    

    【讨论】:

    • D7 不是内置了 HexToBin 吗?
    • 当然可以,但其中的乐趣在哪里? :-)