2012-03-24 240 views
2

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

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

像:

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; 
+0

你的问题不清楚。例子会非常有帮助。你使用什么“十六进制转换器”?所述转换器的输出是什么样的? – 2012-03-24 18:31:52

+0

二进制文件到十六进制编码的Ascii文件链接http://www.csoft.co.uk/hex_converter/index.htm – user1023395 2012-03-24 18:43:29

+2

转换为十六进制字符串真是奇怪。我想不出有什么理由可以这样做。你有什么错误的想法吗? – 2012-03-25 19:23:26

回答

10

的Delphi已有HexToBinClasses)过程中,由于至少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

六角很容易手动解码:

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; 
+6

不是D7内置HexToBin? – 2012-03-25 20:16:05

+3

是的,它有。 ;) – NGLN 2012-03-25 20:59:27

+3

当然,但那里的乐趣在哪里呢? :-) – 2012-03-26 03:33:21