This post shows some code snippets for getting data from Delphi Byte arrays (TBytes) and TMemoryStream’s in and out of Chilkat.
First, here are some code snippets to convert from a TMemoryStream to a byte array, and back.
Delphi TBytes to TMemoryStream
var iStream: TMemoryStream; b: TBytes; OpFile: String; numBytes: Cardinal; begin // Load a file into bytes OpFile := 'C:\qa_data\certs\cert_test123.cer'; b := nil; numBytes := FileToBytes(OpFile, b); if (numBytes > 0) then begin // Byte array to TMemoryStream iStream := TMemoryStream.Create; iStream.Write(b[0], Length(b)); ...
Delphi TMemoryStream to TBytes
var iStream: TMemoryStream; b: TBytes; ... ... // TMemoryStream to byte array. iStream.Seek(0, soBeginning); SetLength(b, iStream.Size); iStream.Read(Pointer(b)^, Length(b)); ...
Load Delphi TBytes into Chilkat BinData
var b: TBytes; hData: HCkBinData; pointerToBytes: PByte; ... begin ... ... hData := CkBinData_Create(); pointerToBytes := PByte(b); CkBinData_AppendBinary2(hData,pointerToBytes,Length(b));
Write contents of Chilkat BinData to a TStream
var rawBytes: PByte; hData: HCkBinData; Stream: TMemoryStream; Writer: TBinaryWriter; i: Integer; numBytes: Integer; begin hData:= CkBinData_Create(); // Append 3 bytes (00, 01, and 02) to the CkBinData object. CkBinData_AppendEncoded(hData, '000102', 'hex'); // Return pointer to raw bytes (internal data) as a System.PByte // Your application does not own the data. If you do something // to the hData, such as append more data, or Clear(), then // your pointer to the bytes will become invalid. rawBytes := CkBinData_getBytesPtr(hData); numBytes := CkBinData_getNumBytes(hData); // Create a type of TStream and write the bytes to it. Stream := TMemoryStream.Create; try Writer := TBinaryWriter.Create(Stream); try for i := 0 to (numBytes - 1) do begin Writer.Write(rawBytes^); Inc(rawBytes); end; finally Writer.Free; end; finally Stream.Free; end;