| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Atacaite Ens

Registrado: 28 Oct 2003Mensajes: 26Ubicación: Gran Canaria
|
Publicado: Jue 14 Abr, 2011 1:42 pm Asunto: Codificar - Decodificar archivo Base64 (Problema WideString) |
|
|
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 |
|
 |
Atacaite Ens

Registrado: 28 Oct 2003Mensajes: 26Ubicación: Gran Canaria
|
Publicado: Jue 14 Abr, 2011 1:45 pm Asunto: |
|
|
Por cierto, el error es el siguiente.
Base64. exe Access violation at address 7C809E3C in module 'Kernel.dll'. Write of address 00000004 |
|
| Volver arriba |
|
 |
Atacaite Ens

Registrado: 28 Oct 2003Mensajes: 26Ubicación: Gran Canaria
|
Publicado: Jue 14 Abr, 2011 2:10 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 14 Abr, 2011 4:04 pm Asunto: |
|
|
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 |
|
 |
Atacaite Ens

Registrado: 28 Oct 2003Mensajes: 26Ubicación: Gran Canaria
|
Publicado: Jue 14 Abr, 2011 4:25 pm Asunto: |
|
|
Muchas gracias Leo.
Funciona perfecto  |
|
| Volver arriba |
|
 |
|