PDA

Ver la versión completa : C Base64 problemas con binarios



erjaimer
07-03-2010, 16:59
Hola mi intención es cargar en una variable de C un fichero binario en Base64 , os cuento mi hazaña y mis frikadas:

imaginemos que tenemos un binario ( un ejecutable , una dll , una imagen , un fichero tipo mp3 , video etc .... ) y quiero matenerlo en mi ejecutable en una variable.

Para eso uso la Base64

es decir abro el fichero en modo binario por ejemplo:

FILE *binario = fopen( "fichero.mp3", "rb");

leo 32 bytes con fread

los encripto en Base64 llamando a una función para ese cometido

desencripto otra vez la cadena

y lo guardo en un fichero en modo binario

ahora escucho el mp3 y no hay problema ( BIEN al menos el algoritmo que uso
para encriptar y desencriptar esta bien ya que encripto el mp3 en B64 lo desencripto y lo guardo
en otro fichero llamado salida.mp3 y se escucha )


SIGAMOS............ ................... ................... ................... ................... ...

el contenido del mp3 lo encripto en base64 quedando algo asi:

UklGRiRwAQBXQVZFZm1 0IBAAAAABAAEARKwAAI hYAQA=AgAQAGRhdGEAcAEAzP2y/Zb9rv3M/Xz9af0Y/n3/0AA=awGYAfABbQKtArwC1AILAzYDRQ

luego lo guardo en un fichero en modo binario llamado encode_mp3

copio el contenido y luego lo pego en una variable de C como sigue aquí:

unsigned char [] = "UklGRiRwAQBXQVZFZm1 0IBAAAAABAAEARKwAAI hYAQA=AgAQAGRhdGEAcAEAzP2y/Zb9rv3M/Xz9af0Y/n3/0AA=awGYAfABbQKtArwC1AILAzYDRQ ................... ............ ";

ahora escribo esta variable desencriptandola y guardo como salida.mp3 y nada el binario queda corrupto. y encima a veces ocupa menos que el mp3 original.

Supongo que es por alguna conversión extraña a ASCII o algo asi......

¿alguna sugerencia ?

¿estoy haciendo algo mal?

¿esto se puede hacer de alguna otra forma ?

¿algun libro , tutorial , website que me de información como hacer esto ?

Un saludo a todos.

foxwar
07-03-2010, 18:34
unsigned char [] = "UklGRiRwAQBXQVZFZm1 0IBAAAAABAAEARKwAAI hYAQA=AgAQAGRhdGEAcAEAzP2y/Zb9rv3M/Xz9af0Y/n3/0AA=awGYAfABbQKtArwC1AILAzYDRQ ................... ............ ";

Por que unsigned char?? debería funcionar con char simplemente no?

Saludos

Marchi
09-03-2010, 04:03
No se puede hacer como contás que haces, por que pueden haber caracteres de control y/o caracteres no imprimibles que traen problemas, por ejemplo que pasa si la cadena encriptada tiene comillas <"> ?.

Para podrías o bien leer desde un archivo con las funciones de la libreria estandar, o si querés guardar la cadena dentro del ejecutable, guardar los valores numéricos de los bytes del archivo.
Para esto tendrías que crearte un programita que te devuelva la cadena lista para usar.

Por ejemplo:


#include <stdio.h>

int main(int c,char** v)
{
char buffer[4096];
int lb,i;
FILE *fd;
if(c<=1) return -1;
lb = 10;
if((fd = fopen(v[1],"rb"))==NULL) return;
lb = fread(buffer,1,sizeof(buffer),fd);
printf("{");
for(i=0;i<lb-1;i++)
printf("%d,",(int)*((char*)(buffer+i)));
printf("%d}\n",(int)*((char*)(buffer+lb-1)));
fclose(fd);
return 0;
}


ahora si lo compilas con nombre "dameLista" lo llamarias:
$ ./dameLista nombre_fichero > fichero.out

de forma que la salida te la deje en el archivo fichero.out

La salida va a tener la forma:

{byte1,byte2, ..... ,byteN}

donde byte1,byte2,.... son numeros decimales.


Saludos