Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-03-2015
frankizzio frankizzio is offline
Miembro
NULL
 
Registrado: abr 2013
Posts: 10
Poder: 0
frankizzio Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 21-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola frankizzio.
Cita:
Empezado por frankizzio Ver Mensaje
...
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 22-03-2015
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
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
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #4  
Antiguo 22-03-2015
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
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.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #5  
Antiguo 22-03-2015
frankizzio frankizzio is offline
Miembro
NULL
 
Registrado: abr 2013
Posts: 10
Poder: 0
frankizzio Va por buen camino
Smile

Gracias por responder, la solución justamente era utilizar DecodeBase64
Responder Con Cita
  #6  
Antiguo 24-03-2015
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por frankizzio Ver Mensaje
Gracias por responder, la solución justamente era utilizar DecodeBase64
Estupendo.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
convertir string a double!! negrokau Varios 6 25-05-2011 12:44:35
convertir un date a string airam C++ Builder 2 25-07-2008 19:58:00
convertir string jsanchez Varios 3 31-07-2006 23:23:19
Convertir un String en un método. OscarG OOP 5 19-12-2005 13:52:35
Convertir Word a String sierraja Varios 3 22-06-2005 16:18:44


La franja horaria es GMT +2. Ahora son las 11:48:41.


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
Copyright 1996-2007 Club Delphi