2017-01-16 4 views
0

Как я могу отправить файл example.wav в байтах байта base64 через UNIX-сокет?Двоичный массив к 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; 
} 

Это мое чтение из файла. Теперь мне нужно получить строку или что-то из этого массива, потому что мне нужно кодировать, и когда я пытаюсь:

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

программа кодирует только что RIFF3.

я могу сделать цикл

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

Тогда я получить что-то более интересную, но все-таки, как я могу кодировать весь двоичный массив. Позже я отправлю закодированную строку через сокет UNIX, но это не тот банкомат.

EDITED:> Я использую алгоритм для кодирования http://fm4dd.com/programming/base64/base64_stringencode_c.htm. Это неправильно для двоичных?

+0

Вы не можете использовать функции строки с двоичными данными. Двоичные данные могут содержать байты, которые ноль находятся внутри данных, и это то же значение, что и для терминатора строк. Конечно, он может содержать непечатаемые «символы», как вы видите на своем выходе. –

+0

Тогда как я должен отправлять двоичные данные через сокет или конвертировать в base64? –

+1

Возможный дубликат [Как кодировать (декодировать) base64 в C?] (Http://stackoverflow.com/questions/342409/how-do-i-base64-encode-decode-in-c) –

ответ

0

Функция, которую вы используете (b64_encode), может кодировать только строки. Убедитесь, что вы изменили функцию так, чтобы она повторялась по всем символам в буфере.

Может быть что-то, как это будет работать (я не проверял код):

/* 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); 
    } 
    } 
} 
Смежные вопросы