2017-01-16 3 views
0

example.wavファイルのバイトをUNIXソケット経由でbase64にエンコードするにはどうすればよいですか?2進配列から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])} 

を行うことができ、私はもっと何かのintrestingを得るが、それでも、どのように私は、全体のバイナリ配列をコードすることができます。 後で、私はUNIXソケット経由でエンコードされた文字列を送信しますが、ATMの場合はそうではありません。

EDITED:> 私はhttp://fm4dd.com/programming/base64/base64_stringencode_c.htmエンコーディングアルゴリズムを使用します。バイナリに間違っていますか?

+0

あなたは、バイナリデータを文字列関数を使用することはできません。バイナリデータには、データ内の任意の場所に0のバイトが含まれている可能性があります。これは、文字列ターミネータで使用される値と同じです。もちろん、出力に表示されるように、印刷不可能な「文字」を含むこともできます。 –

+0

次に、ソケット経由でバイナリデータを送信するか、base64に変換する必要がありますか? –

+1

[Cでbase64エンコード(デコード)する方法は?](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); 
    } 
    } 
} 
関連する問題