Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Convertir String - TDynArray - Archivo ZIP (https://www.clubdelphi.com/foros/showthread.php?t=87937)

frankizzio 21-03-2015 01:11:36

Convertir String - TDynArray - Archivo ZIP
 
Hola,
Estoy realizando un client web service pero me estoy estancando en lo siguiente, ya genere la conexión con el servidor y este me envía un XML de respuesta, que es el siguiente

Código:

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="ht tp: / /sche mas.xmls oap.or g/soap/envelope/">
<S:Body>
<ns2:sendBillResponse xmlns:ns2="h t t p : //serv ice . co m"><applicationResponse>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</applicationResponse>
</ns2:sendBillResponse>
</S:Body>
</S:Envelope>

El xml muestra una etiqueta llamada aplicationresponse la cual tiene una cadena que viene a ser un arreglo de bytes (TByteDynArray) la cual contiene un archivo zipeado, este archivo zip contiene un archivo xml con la constancia de recepción del web service.

Mi problema se da cuando quiero convertir el archivo zip, siempre que lo abro me aparece el mensaje de error "El archivo tiene un formato desconocido o está dañado", El proceso que realizo es el siguiente

En el AfterExecute extraigo la respuesta

Código Delphi [-]
procedure TForm1.HTTPRIO1AfterExecute(const MethodName: string;
  SOAPResponse: TStream);
begin
  ConverZipFile(StreamToString(SOAPResponse));
end;
Luego utilizando los siguientes procesos realizó las conversiones hasta crear el archivo zip

Código Delphi [-]
procedure ConverZipFile(XML: String);
    var
  Doc     : IXMLDocument;
  Elemento: IXMLNode;
  ByteB   : TByteDynArray;
begin
  Doc := LoadXMLData(XML);
  Elemento := Doc.DocumentElement.ChildNodes.FindNode('S:Body');
  Elemento := Elemento.ChildNodes.Get(0);
  Elemento := Elemento.ChildNodes.Get(0);
  ByteB:=StringToByteArray2(VarToStr(Elemento.NodeValue));
  ByteArrayToFIle(ByteB,'D:\E-Billing\demo.ZIP');
end;


function StringToByteArray2(Str: AnsiString): TByteDynArray;
var
  MSTream: TMemoryStream;
  pTemp: pointer;
begin
  MStream := TMemoryStream.Create;
  MStream.Write(str,length(str));
  MStream.Position := 0;

  SetLength(Result, MStream.Size);
  pTemp := @Result[0];
  MStream.Position := 0;
  MStream.Read(pTemp^, MStream.Size);

  MStream.Free;
end;



procedure ByteArrayToFIle( ByteArray : TByteDynArray;
                           FileName : string );
var Count : integer;
    F : FIle of Byte;
    pTemp : Pointer;
begin
  AssignFile( F, FileName );
  Rewrite(F);
  try
    Count := Length( ByteArray );
    pTemp := @ByteArray[0];
    BlockWrite(F, pTemp^, Count );
  finally
    CloseFile( F );
  end;
end;

La documentación del web service especifica que la respuesta es un arreglo de bytes de base64,
Espero me puedan ayudar.

ecfisa 21-03-2015 05:05:25

Hola frankizzio.
Cita:

Empezado por frankizzio (Mensaje 490265)
...
La documentación del web service especifica que la respuesta es un arreglo de bytes de base64,

No se si tendrá que ver con el error, pero si tenes que trabajar en base 64 intenta de este modo:
Código Delphi [-]
uses Types;

// String -> TInt64DynArray
function StringToBDA64(str: AnsiString): TInt64DynArray;
begin
  SetLength(Result, Length(str));
  Move(str[1], Result[0], Length(str));
end;

// TInt64DynArray -> String
function BDA64ToString(bda: TInt64DynArray): AnsiString;
begin
  SetString(Result, PAnsiChar(@bda[0]), Length(bda));
end;

// TInt64DynArray -> file
procedure BDA64ToFile(bda: TInt64DynArray ; const FileName: string);
begin
  with TMemoryStream.Create do
  try
    Write(bda[0], Length(bda));
    SaveToFile(FileName);
  finally
    Free;
  end;
end;

Saludos :)

jhonny 22-03-2015 03:11:38

Bueno, en caso de algo, quizá no esté de más probar con la función DecodeBase64 de la unidad Soap.EncdDecd

De hecho, por acá hay un ejemplo al respecto http://stackoverflow.com/questions/8...-binary-delphi

jhonny 22-03-2015 06:47:03

Me he permitido sugerir esta manera, aplicada a lo que estás haciendo, lo cual sería solamente agregar EncdDecd al uses y cambiar el procedimiento llamado ConverZipFile un poco, así:

Código Delphi [-]
uses Soap.EncdDecd;

procedure ConverZipFile(XML: String);
    var
  Doc     : IXMLDocument;
  Elemento: IXMLNode;
  ByteB   : TByteDynArray;
begin
  Doc := LoadXMLData(XML);
  Elemento := Doc.DocumentElement.ChildNodes.FindNode('S:Body');
  Elemento := Elemento.ChildNodes.Get(0);
  Elemento := Elemento.ChildNodes.Get(0);
  ByteB:=TByteDynArray(EncdDecd.DecodeBase64(XML));
  ByteArrayToFIle(ByteB,'D:\E-Billing\demo.ZIP');
end;

Espero te sirva.

frankizzio 22-03-2015 18:59:38

Gracias por responder, la solución justamente era utilizar DecodeBase64

jhonny 24-03-2015 02:55:36

Cita:

Empezado por frankizzio (Mensaje 490301)
Gracias por responder, la solución justamente era utilizar DecodeBase64

Estupendo.


La franja horaria es GMT +2. Ahora son las 02:41:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi