Consider string in the TStream interface as a character / byte buffer.
This is a bit more complicated with Unicode's Inno Setup version , where the string is an array of 2-byte characters (compared to the legacy Ansi version, since one byte equals one character - although in Inno Setup 6, Unicode is actually the only version available anyway )
See also Reading bytes from a file in the right place using Inno Setup .
To convert a hexadecimal string to actual binary data, you can use the CryptStringToBinary function of the Windows API .
The following code works in both Ansi and the Unicode version of Inno Setup.
#ifndef Unicode const CharSize = 1; #define AW "A" #else const CharSize = 2; #define AW "W" #endif function CryptStringToBinary( sz: string; cch: LongWord; flags: LongWord; binary: string; var size: LongWord; skip: LongWord; flagsused: LongWord): Integer; external 'CryptStringToBinary{#AW}@crypt32.dll stdcall'; const CRYPT_STRING_HEX = $04; procedure WriteHexToFile(Hex: string; FileName: string); var Stream: TFileStream; Buffer: string; Size: LongWord; begin Stream := TFileStream.Create(FileName, fmCreate); try SetLength(Buffer, (Length(Hex) div 2*CharSize) + CharSize - 1); Size := Length(Hex) div 2; if (CryptStringToBinary( Hex, Length(Hex), CRYPT_STRING_HEX, Buffer, Size, 0, 0) = 0) or (Size <> Length(Hex) div 2) then begin RaiseException('Error decoding hex string'); end; Stream.WriteBuffer(Buffer, Size); finally Stream.Free; end; end;
Use it like:
procedure WriteHexToFileTest; var Hex: string; begin Hex := '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f' + '202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f' + '404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f' + '606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f' + '808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f' + 'a0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf' + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedf' + 'e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff'; WriteHexToFile(Hex, 'my_binary_file.dat'); end;
Martin Prikryl Jul 27 '16 at 16:12 2016-07-27 16:12
source share