Шестнадцатеричное преобразование в двоичное - PullRequest
2 голосов
/ 24 марта 2012

Я преобразовал свой jpeg-файл как HEX-код с помощью шестнадцатеричного конвертера.

Теперь, как преобразовать этот шестнадцатеричный код в двоичный файл и сохранить как 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; 

Ответы [ 2 ]

11 голосов
/ 26 марта 2012

В 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 голосов
/ 25 марта 2012

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;
...