2017-01-16 1 views
0

Comment puis-je envoyer des octets de fichier example.wav codés en base64 via un socket UNIX?Binary array to base64

char* readFileBytes(const char *name){ 
FILE *fl = fopen(name, "rb"); 
fseek(fl, 0, SEEK_END); 
long len = ftell(fl); 
char *ret = malloc(len); 
fseek(fl, 0, SEEK_SET); 
fread(ret, 1, len, fl); 
fclose(fl); 
return ret; 
} 

Ceci est ma lecture du fichier. Maintenant, je dois obtenir la chaîne ou quelque chose de ce tableau, parce que je dois encoder, et lorsque je tente de:

programme
printf("%s\n", ret); 
Output: RIFF�3 

encode seulement RIFF3.

Je peux faire du cycle

for(int i=0; i<len;i++){printf("%u ",ren[0])} 

Puis-je obtenir quelque chose de plus intresting, mais encore, comment puis-je encoder toute matrice binaire. Plus tard, je vais envoyer une chaîne encodée via socket UNIX, mais ce n'est pas le cas ATM.

EDITED:> J'utilise l'algorithme http://fm4dd.com/programming/base64/base64_stringencode_c.htm pour le codage. Est-ce mal pour binaire?

+0

Vous ne pouvez pas utiliser les fonctions de chaîne avec des données binaires. Les données binaires peuvent contenir des octets nulle à l'intérieur des données, et c'est la même valeur que celle utilisée pour le terminateur de chaîne. Il peut aussi bien sûr contenir des "caractères" non imprimables comme vous le voyez dans votre sortie. –

+0

Alors, comment dois-je envoyer des données binaires via socket, ou convertir en base64? –

+1

Copie possible de [Comment coder en base64 (décoder) en C?] (Http://stackoverflow.com/questions/342409/how-do-i-base64-encode-decode-in-c) –

Répondre

0

La fonction que vous utilisez (b64_encode) ne peut encoder que des chaînes. Assurez-vous de modifier la fonction de sorte qu'elle itère sur tous les caractères du tampon.

Peut-être quelque chose comme ça fonctionnera (je ne l'ai pas testé le code):

/* encode - base64 encode a stream, adding padding if needed */ 
void b64_encode(char *clrstr, int length, char *b64dst) { 
    unsigned char in[3]; 
    int i, len = 0; 
    int j = 0; 

    b64dst[0] = '\0'; 
    while(j<length) { 
    len = 0; 
    for(i=0; i<3; i++) { 
    in[i] = (unsigned char) clrstr[j]; 
    if(j<length) { 
     len++; j++; 
     } 
     else in[i] = 0; 
    } 
    if(len) { 
     encodeblock(in, b64dst, len); 
    } 
    } 
}