Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Codificar - Decodificar archivo Base64 (Problema WideString)

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Codificar - Decodificar archivo Base64 (Problema WideString) Responder citando

Hola amigos,

Tengo la necesidad de codificar / decodificar archivos a base64 para poder intercambiar ficheros con un servicio web en JAVA. Estoy utilizando BCB6.

He estado leyendo topics en el foro y he visto que otros usuarios han utilizado las librerias de CAPICOM para codificar decodificar en Base64. He realizado la instalacion del SDK sin problemas.

Para codificar codifico sin problemas gracias a un codigo que colgo Leo en su momento.

CoInitialize(0);

// Abrimos el archivo de entrada y creamos el de salida
std::auto_ptr<TFileStream> fsIn(new TFileStream("miarchivo.pdf", fmOpenRead | fmShareDenyWrite));

// Creamos un VarArray y copiamos en el todo el fichero de entrada
int bounds[2] = {1, fsIn->Size};
TVariant v(VarArrayCreate(bounds, 1, varByte));
PVOID buffer = VarArrayLock((Variant*)&v);
fsIn->Read(buffer, fsIn->Size);
VarArrayUnlock((Variant*)&v);

// Hacemos la conversion a Base64 y lo salvamos
TCOMIUtilities util = CoUtilities::Create();
TOleString strBin(util->ByteArrayToBinaryString(v));
TOleString strB64(util->Base64Encode(strBin));

String strOut(strB64);

En la variable srtOut tengo el texto con el archivo en Base64 y he comprobado que los datos estan ok.

Ahora tengo que hacer el proceso contrario. Recoger la variable de texto en Base64 que me devuelve el servicio web en JAVA, decodificar Base64 y crear el fichero final.

Para ello voy a intentar usar de nuevo las librerias de CAPICOM. El problema es que la libreria utiliza variables widestring y me está dando el codigo error de memoria al intentar pasar de AnsiString a WideString.

El codigo que utilizo para pasar de ansiString a WideString es el siguiente:

std::auto_ptr<TFileStream> fsOut(new TFileStream("miarchivo2.pdf", fmOpenWrite | fmCreate | fmShareExclusive));
wchar_t *wcharB64;
StringBase64.WideChar(wcharB64, StringBase64.WideCharBufSize());
TCOMIUtilities util = CoUtilities::Create();
strout = AnsiString(util->Base64Decode(wcharB64));
fsOut->Write(strout.c_str(), strout.Length());

La variable StringBase64 es un AnsiString y esta declarado como variable global. Confirmado que tiene los datos que necesitamos.

La linea que me da el error es la siguiente

StringBase64.WideChar(wcharB64, StringBase64.WideCharBufSize());

¿Alquien me puede hechar una mano a soulcionar el problema? He probado mil cosas y no hay manera de que salga adelante.

Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Por cierto, el error es el siguiente.

Base64. exe Access violation at address 7C809E3C in module 'Kernel.dll'. Write of address 00000004
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Responder citando

He probado a sustituir la línea que da error por esta otra a ver si el problema está en la conversión y sigue dando el mismo error.

StringToWideChar(StringBase64, wcharB64, StringBase64.Length());

¿Podria estar el error en la declaracion de la variable widestring?

wchar_t *wcharB64;

Odio los widechar!!!!!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Prueba con:
Código:
    TCOMIUtilities util = CoUtilities::Create();
    TOleString strBin = util->Base64Decode(WideString(StringBase64));

    std::auto_ptr<TFileStream> fsOut(new TFileStream("d:\\miarchivo2.pdf",
        fmOpenWrite | fmCreate | fmShareExclusive));
    fsOut->Write(strBin, SysStringByteLen(strBin));
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias Leo.

Funciona perfecto Razz Razz Razz
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.