2012-07-02 6 views
0

мне нужно реализовать в Delphi 2006 в АЛГОРИТМ, которые работают в .netстроку в массив байтов и массив байтов в файл

Basicaly мне нужно сделать следующие шаги:

  1. Создание XML и проверки aganist в XSD
  2. сериализации строки XML в массив байт UTF-8 закодированных и сжать его с молнией
  3. сжатой информация должна быть сохранена снова в массив байт, используя Base256 формат
  4. Создайте изображение с помощью Datamatrix 2D BarCode из этого массива байтов и поместите это изображение в отчет

Для шага 1 я создаю XML, используя библиотеку NativeXML, которая работает нормально. В этой библиотеке существует метод SaveToBinaryFile, но не работает нормально. В моих тестах я использовал эту функцию для создания двоичного файла. Я был вынужден использовать двоичный файл, потому что мой компонент Zip работает только с файлами, не связанными с строками или байтом из памяти.

Я сжал этот двоичный файл с помощью компонента Zip и загрузил этот сжатый файл в файл blob. В тот момент, когда мне нужно создать образ DataMatrix, я загружаю этот файл blob в ansistring и создаю образ.

После многих тестов я обнаружил, что моя ошибка в том, что я сохраняю свой XML в двоичном файле. Теперь мне нужно найти другой способ сохранить мою строку xml (utf-8) в файле binarry. Прошу прощения за мой английский. Может ли кто-нибудь мне помочь?

+1

Вы можете полностью опустить шаг преобразования в двоичный код. Когда вы храните файл с помощью TNativeXML.SaveToFile, он уже закодирован в кодировке UTF-8, если вы не указали другую кодировку. –

+0

Да, но результат не в порядке. Образ DataMatrix не может быть снова преобразован в xml из приложения, созданного с использованием других языков – sorin

+0

, когда я использую SavetoBinaryfile, некоторые части XML могут быть получены из образа DataMatrix. – sorin

ответ

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

Спасибо за ваши усилия. Я основал в Интернете процедуру, которую я использовал для «сериализации» строки и процедуры, которую я использовал для сохранения массива байтов в файл. Я объединил эти процедуры, и результат был опубликован здесь – sorin

Смежные вопросы