2013-06-08 2 views
0

여기서 Ryyst의 코드 (How do I base64 encode (decode) in C?)를 사용하여 이미지 파일을 base64로 인코딩하여 HTML 문서에 삽입합니다.C에서 Base64 인코딩 -이 하나의 길잃은 "X"는 어디서 오는가?

작동합니다! - base64로 인코딩 된 출력의 두 번째 줄을 제외하고는 줄의 끝에 하나의 길잃은 "X"가 있습니다.

이진 파일의 크기에 상관없이 항상 두 번째 줄과 두 번째 줄만 사용합니다 (많은 시도를 했음).

손상된 "X"를 수동으로 제거하면 인코딩 된 데이터가 base64 유틸리티의 출력과 정확하게 일치하며 이미지가 브라우저에서 올바르게 디코딩됩니다.

각 문자 배열의 끝 부분에 "\ 0"을 추가하여 제대로 끝났는지 확인했습니다 (차이가 없음). 나는 "버퍼"가 항상 60 바이트이고 output_length는 항상 80 바이트라는 것을 확인했다. 나는 그것을 읽었을 때 Ryyst의 코드를 읽고 다시 읽었습니다 (아무 것도 보이지 않지만 C n00b입니다). 나는 비를 춤 췄다. 나는 화산을 던져 버린 처녀 자리를 찾았다. 아직 버그가 있습니다. 나는 또한 CGIC 라이브러리 V (205)를 사용하고,

char *base64_encode(const unsigned char *data, size_t input_length, 
    size_t *output_length) 
{ 

    *output_length = 4 * ((input_length + 2)/3); 

    char *encoded_data = malloc(*output_length); 
    if (encoded_data == NULL) 
    return NULL; 
    int i = 0, j = 0; 
    for (i = 0, j = 0; i < input_length;) 
    { 

    uint32_t octet_a = i < input_length ? data[i++] : 0; 
    uint32_t octet_b = i < input_length ? data[i++] : 0; 
    uint32_t octet_c = i < input_length ? data[i++] : 0; 

    uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c; 

    encoded_data[j++] = encoding_table[(triple >> 3 * 6) & 0x3F]; 
    encoded_data[j++] = encoding_table[(triple >> 2 * 6) & 0x3F]; 
    encoded_data[j++] = encoding_table[(triple >> 1 * 6) & 0x3F]; 
    encoded_data[j++] = encoding_table[(triple >> 0 * 6) & 0x3F]; 
    } 

    for (i = 0; i < mod_table[input_length % 3]; i++) 
    encoded_data[*output_length - 1 - i] = '='; 

    return encoded_data; 
} 

(당신이 볼 수있는 -

while (cgiFormFileRead(CoverImageFile, buffer, BUFFERLEN, &got) ==cgiFormSuccess) 
{ 
    if(got>0) 
    { 
    fputs(base64_encode(buffer, got, &output_length), targetfile); 
    fputs("\n", targetfile); 
    } 
} 

그리고 base64_encode 기능입니다 -

다음은 코드의 중요한 비트입니다 하지만 문제가 있다고 생각하지 않습니다 그 바이트의 올바른 숫자를 제공하기 때문에) (그리고 BUFFERLEN 상수, 60 같습니다.)

내가 뭘 잘못하고 있니?

(더욱 실망스럽게도, I/한/Ryyst의 알고리즘은 이전에 완벽하게 한 번 작동하도록, 그래서 자신의 코드/수행/일.)

내가 ARM 기반 데비안 리눅스 시스템에 GCC를 사용하여 컴파일하고있어, 그게 어떤 차이가 있다면.

답변

1

삭제 한 원래와 기능을 비교 : 그 외에도

encoded_data[j++] = encoding_table[(triple >> 0 * 6) & 0x3F]; 

이 기능은 동일, 내가 그건 그냥 복사 오류 같은데요.

문제는 got을 읽는 것보다 BUFFERLEN을 사용하는 것이고 두 번째 줄은 전체 60자를 읽지 않으므로 버퍼 끝에있는 모든 쓰레기를 인코딩합니다.

+0

감사합니다. parkydr! 추천 한대로 내 코드를 업데이트했습니다 (예상대로 터미널에서 오타 복사하고 "얻음"에 좋은 점). 그러나 "X"는 여전히 정확히 같은 위치에 나타납니다. >> : - [NULL 종료를 다시 시도합니다. 지금 도움이되는지 확인하십시오. – Raw

+0

출력을 종료해야하며, 함수는 종료되지 않습니다. , 단지 길이를 제공하므로 buffer [output_length] = '\ 0'이 필요합니다. 당신은 실제로 당신이 실제로 읽고있는 것을 볼 수있는 인쇄를 시도 했습니까? – parkydr