字符串到字节数组和字节数组到文件

时间:2012-07-02 16:02:38

标签: arrays string delphi file binary

我需要在Delphi 2006中实现一个在.net

中工作的算法

基本上我需要做下面的步骤:

  1. 创建XML并验证对XSD的攻击
  2. 将XML字符串序列化为UTF-8编码的字节数组,并使用zip
  3. 对其进行压缩
  4. 必须使用base256格式
  5. 将压缩信息再次存储到字节数组中
  6. 使用此字节数组中的Datamatrix 2D BarCode创建图像,并将此图像放在报告上
  7. 对于第1步,我使用可正常工作的NativeXML库创建XML。在这个库中存在一个metod SaveToBinaryFile但不能正常工作。在我的测试中,我使用此函数来创建二进制文件。 我被迫使用二进制文件,因为我的Zip组件仅适用于没有字符串或内存中的字节数的文件。

    我使用Zip组件压缩了这个二进制文件,并将这个compresed文件加载到blob文件中。 在我需要创建DataMatrix图像时,我将此blob文件加载到ansistring中,然后创建图像。

    经过多次测试后,我发现我的错误是将XML保存到二进制文件中。 现在我需要找到另一种方法将我的xml(utf-8)字符串保存到二进制文件中。 抱歉我的英语。 任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

    procedure CreateXMLBarcodeș
    var
     BinarySize: Integer;
     InputString: utf8string;
     StringAsBytes: array of Byte;
     F : FIle of Byte;
     pTemp : Pointer;


    begin
     InputString := '';
     ADoc := TNativeXml.CreateName(rootName);
     try
       ... //create the XML
       InputString := ADoc.WriteToLocalString; //utf8string
       if InputString > '' then begin
          //serialize the XML string to array of bytes
          BinarySize := (Length(InputString) + 1) * SizeOf(Char);
          SetLength(StringAsBytes, BinarySize);
          Move(InputString[1], StringAsBytes[0], BinarySize);
          //save the array of bytes to file
          AssignFile( F, xmlFilename );
          Rewrite(F);
          try
           BinarySize := Length( StringAsBytes );
           pTemp := @StringAsBytes[0];
           BlockWrite(F, pTemp^, BinarySize );
          finally
           CloseFile( F );
          end;
       end;
       finally
        ADoc.Free;
       end;
     end

    ...
    //in other procedure:
         DataSet1XMLBarCode.LoadFromFile(CreateXMLBarcode);
    ...

    //when I want to create the report
    //create the DataMatrix image
    procedure xyz(Sender: TfrxReportComponent);
    var  AWidth, AHeight: Integer;
     function GetStringFromBlob: AnsiString;
     var BlobStream: TStream;
     begin
      Result := '';
      DataSet.Open;
      BlobStream := DataSet1.
                       CreateBlobStream(DataSet1XMLBarCode, bmRead);
      try
       SetLength(Result, BlobStream.Size);
       BlobStream.Position := 0;
       BlobStream.Read(Result[1], BlobStream.Size);
      finally
       BlobStream.Free;
      end;
      DataSet.Close;
     end;
    begin
     Barcode2D_DataMatrixEcc2001.Locked := True;
     Barcode2D_DataMatrixEcc2001.Barcode := GetStringFromBlob;
     Barcode2D_DataMatrixEcc2001.Module := 1;
     Barcode2D_DataMatrixEcc2001.DrawToSize(AWidth, AHeight);
     with TfrxPictureView(frxReport1.FindObject('Picture1')).Picture.Bitmap do
     begin
      Width := AWidth;
      Height := AHeight;
      Barcode2D_DataMatrixEcc2001.DrawTo(Canvas, 0, 0);
     end;
     Barcode2D_DataMatrixEcc2001.Locked := False;
    end;

    //the code was 'çopied'and adapted from the internet