Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Tipo de datos TByteDynArray (https://www.clubdelphi.com/foros/showthread.php?t=85644)

JM1985 11-04-2014 17:19:55

Tipo de datos TByteDynArray
 
Esta es mi otra opción.. consumir un web service.

Pero se me presenta otro detalle mi piden como parámetro TByteDynArray XML

y mi XML es un AnsiString.


Como convierto AnsiString a TByteDynArray??

Gracias.

Saludos.

ecfisa 11-04-2014 18:12:37

Hola JM1985.
Cita:

Empezado por JM1985 (Mensaje 475072)
Como convierto AnsiString a TByteDynArray??

Podes hacer:
Código:

void AnsiStringToBDA(AnsiString str, TByteDynArray &bda)
{
  bda.set_length(str.Length());
  Move(&str, &bda, str.Length());
};

Ejemplo de uso:
Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  AnsiString tmp, cadena = "ABC 012";
  TByteDynArray  vec;

  AnsiStringToBDA(cadena, vec);
  for(int i=0; i<vec.Length;i++)
    Memo1->Lines->Add(vec[i]);  // 65 66 67 32 48 49 50
}

Saludos :)

JM1985 11-04-2014 18:48:46

Hola que tal ecfisa Gracias por responder.


Voy a probar y te comento.

Saludos.

JM1985 11-04-2014 19:32:38

Hola Eficsa
estoy tratando de implementar tu ejemplo pero no me convierte los caracteres a byte reemplaza la cadena por ???? y al ByteArray le agrega al prinicipio 3444 ?????, y la cadena..

Algo raro es que luego el usuario y la contraseña las vuelve ????? ???????

esto estoy haciendo.

Código:

cfdi = archivoXML->Text;

          TByteDynArray vec;
          StringToByteArray(cfdi, vec);


          AnsiString cResponse;
          _di_Application ServicioFINKOK = GetApplication();
          AcuseRecepcionCFDI *response;
          ServicioFINKOK->stamp(vec, InfoMain->usuarioCFDI, InfoMain->contraseniaCFDI);
          cResponse = response->xml;


Este es el método.

Código:

TByteDynArray TfrmFormaXML20::StringToByteArray(AnsiString cCadena, TByteDynArray &bda)
{
    bda.set_length(cCadena.Length());
    Move(&cCadena, &bda, cCadena.Length());
}


ecfisa 11-04-2014 19:35:56

Hola de nuevo.

Hago una correción del código anterior: (me dió problemas en una prueba posterior)
Código:

void AnsiStringToBDA(AnsiString str, TByteDynArray &bda)
{
  bda.set_length(str.Length());
  Move(str.c_str(),  &bda[0],  str.Length()); // <- Cambia esta línea
};

Ejemplo:
Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  AnsiString str = "Foros Club Delphi > Otros entornos y lenguajes > C++ Builder";
  TByteDynArray bda;

  Memo1->Clear();
  AnsiStringToBDA(str, bda);
  for(int i=0; i<bda.Length;i++)
    Memo1->Lines->Add((char)bda[i]);
}

Saludos :)

Edito: No había visto tu último mensaje, proba con el cambio que te comento.

JM1985 11-04-2014 20:05:58

2 Archivos Adjunto(s)
Te adjunto unas imagenes para que veas como me queda el resultado al final creo que no lo está codificando.


El método para consumir el web service me pideun parámetro como tipo TByteDynArray;


Código:

virtual AcuseRecepcionCFDI* stamp(const TByteDynArray xml, const AnsiString username, const AnsiString password) = 0;

y te devuelve como una clase y ahi accedes a lo que te devolvió no había visto algo parecido.

ecfisa 11-04-2014 21:38:28

Hola JM1985.

No alcanzo a distinguir el texto en las imágenes y lamentablemente desconozco el método AcuseRecepcionCFDI, pero fijate este ejemplo que demuestra que el valor del AnsiString pasa correctamente al ByteDynArray:
Código:

// Pasa el contenido del AnsiString al ByteDynArray
void AnsiStringToBDA(AnsiString str, TByteDynArray &bda)
{
  bda.set_length(str.Length());
  Move(str.c_str(),  &bda[0],  str.Length());
};

// Muestra el contenido del ByteDynArray como char
void ShowBDA(TByteDynArray bda, TMemo *Me) {
  String s;

  for(int i=0;i< bda.Length; i++) s += (char)bda[i];
  Me->Clear();
  Me->Lines->Add(s);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  AnsiString str = "Foros Club Delphi > Otros entornos y lenguajes > C++ Builder";
  TByteDynArray bda;

  AnsiStringToBDA(str, bda);    // AnsiString a ByteDynArray
  ShowBDA(bda, Memo1); // mostrar contenido de ByteDynArray
}

Saludos :)

JM1985 12-04-2014 15:45:23

AcuseRecepcion
 
Hola buen día eficsa

disculpa ayer ya no continué con este hilo debido a que me dedique con otro requerimiento ya que este que ando resolviendo ya me llevo algo de tiempo.


Voy a probar y te comento.

Te podría enviar la clase que se genera al momento de importar el web service?..

Saludos


La franja horaria es GMT +2. Ahora son las 17:05:53.

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