2017-12-14 3 views
0

Base64 문자열을 디코딩하고 마지막으로 jpg 이미지를 출력했습니다.C++ base64_decode() return null

내가 발견 한 Base64 디코드 기능으로 Base64 문자열을 디코하려고하면 here 빈 문자열이납니다. 여기

내 코드입니다 : ". encodedString는 base64로 문자열은 다음과 같습니다"

std::string decodedString, encodedString; 

decodedString = base64_decode(encodedString); 

하고 base64_decode 기능 :

static const std::string base64_chars = 
      "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
      "abcdefghijklmnopqrstuvwxyz" 
      "/"; 


static inline bool is_base64(unsigned char c) { 
    return (isalnum(c) || (c == '+') || (c == '/')); 
} 

std::string base64_decode(std::string const& encoded_string) { 
    int in_len = encoded_string.size(); 
    int i = 0; 
    int j = 0; 
    int in_ = 0; 
    unsigned char char_array_4[4], char_array_3[3]; 
    std::string ret; 

    while (in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])) { 
    char_array_4[i++] = encoded_string[in_]; in_++; 
    if (i ==4) { 
     for (i = 0; i <4; i++) 
     char_array_4[i] = base64_chars.find(char_array_4[i]); 

     char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); 
     char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); 
     char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; 

     for (i = 0; (i < 3); i++) 
     ret += char_array_3[i]; 
     i = 0; 
    } 
    } 

    if (i) { 
    for (j = i; j <4; j++) 
     char_array_4[j] = 0; 

    for (j = 0; j <4; j++) 
     char_array_4[j] = base64_chars.find(char_array_4[j]); 

    char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); 
    char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); 
    char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; 

    for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; 
    } 

    return ret; 
} 

의 내 Base64로 :

/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAIOAcADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoorz79qv9p7wh+xj+z14q+J/jy+l0/wn4PtPtl/NFH5spBdY0jjTI3O8joirkZZgKAPQaK/Lb/iMC/Y7/wCfz4lf+Ez/APba9g/YX/4OJv2bf+Chn7RGnfC7wBqniqLxZq9t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/wAITS//AIxR/wAOyP2bf+je/gf/AOEJpf8A8Yr3CigD8G/+Duf/AIJSeBfh5+yf4L+Mvwr+H/hLwUvgrVjpPiWDw5otvpsNzZ3u1YLiZYUVWMVwiRgkZ/0vHQDH889f3Y/tlfszaP8Atl/sqfED4Wa6EXTfHWh3OlNKy7vskrofJnA/vRShJF/2kFfw1fE74c6x8HviT4g8JeIbR7DXvC+pXGk6lbN963uYJWilQ/R0YfhQB/TF/wAGdf7dP/C+f2D9c+D2r3nm6/8ABvUf9BWRsvJpF6zyw4zy3lzi5Q44VTCOMiv1+r+On/g3U/bp/wCGD/8Agqf4B1bULz7J4T8cyf8ACHeICzbY1t7x0WKVj0CxXK28hbsiOO9f2LUAfyI/8HTXxok+MH/BaX4mW4lMtl4LtdM8OWnOdqxWcU0q+2LieeuF/wCDdv4Mx/HP/gs78B9KnhEtvpWuSeIZCRlYzp1tNfRsf+2sEYHuRXnH/BYHxXJ40/4KsftHX8jF/wDi5GvWyE944b+aFP8Ax2Na+xP+DPHwzFr3/BX8XUihn0XwRq17GT/CzPbQZ/75mb86AP6q6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/Z 

이미지 그냥 A7 내가 몇 웹 사이트에서 확인했는데 잘 작동합니다. 또한이 코드 블록은 다른 프로젝트에서 완벽하게 작동합니다. 내가 Clion 2017.3, 우분투 16.04를 사용하고 있습니다 그런데

, CXX_STANDARD 11

+0

2 진 버퍼에'std :: string'을 사용하는 것은 좋지 않습니다. 대신 std :: vector 대신에 (또는 unsigned char)를 사용합니다. 나는 그 문자열이 비어 있지 않을 것이라고 생각합니다. – Slava

+0

@Slava 소스도 문자열입니다. 그리고 디코더 기능도 디버깅했습니다. return "ret"값은 항상 null입니다. 예, 그렇습니다. :: string은 바이너리 버퍼를 잘못 생각할 수도 있지만 문제는 아닙니다. –

+0

"가치는 언제나"는 무엇을 의미합니까? 이 문자열은 0 바이트를 포함 할 수있는 바이너리 데이터를 가지며 'std :: cout'에 대한 출력은 아무 것도 표시하지 않습니다. 그래서 나는 좋은 생각이 아니라고 말했다. ret.length()가주는 것은 무엇입니까? – Slava

답변

0

정말 짜증나는 문제였습니다. 나는 많은 알고리즘을 시도했고 많은 방법으로 코드를 변경했다.

누군가가 궁금한 점이 있다면, 여기 내 해결책이 있습니다. 내 encodedString 문자열에 특수 문자가 있습니다. (/ n/r/t) 그게 왜 내가 코드를 디코딩하기 전에 일부 코드를 추가했습니다 :

그 디코더는 잘 작동 후.

0

당신이 포착 알고리즘은 정말 느립니다. 배열 액세스가 너무 많습니다 (레지스터 대신 스택에 값이 저장 됨). 바이트 당 너무 많은 시프트 및 논리 연산이 발생합니다.

다음은 훨씬 간단하고 효율적인 알고리즘의 기본 루프입니다. 바이너리 데이터도 인코딩 할 수 있으므로 출력은 문자열이 아닙니다.

맞춤 인코딩 테이블을 지정할 수 있다는 것도 중요합니다. 이 기술은 종종 라이센스 키 및 암호화 관련 작업을 더 혼란스럽게하는 데 사용됩니다.

size_t Base64Decode(const std::string& strSrc, void* pvDest, size_t nBytesMax, const char* szEncodingChars) 
{ 
    size_t nBytesOut = ((strSrc.length() * 6) + 7)/8; 
    BYTE* pchOut = reinterpret_cast<BYTE*>(pvDest); 
    if (nBytesOut > nBytesMax) 
     return 0; 

    size_t nBytesIn = strSrc.length(); 
    try 
    { 
     WORD w  = 0; // work buffer 
     UINT nShift = 0; // shift left needed to align new glyph into buffer w 
     for (size_t i = 0; i < strSrc.length(); ++i, nShift += 6) 
     { 
      if (!szEncodingChars) 
      { 
       w |= (CharToNibble(strSrc[i]) << nShift); 
      } 
      else 
      { 
       const char* p = strchr(szEncodingChars, strSrc[i]); 
       if (!p) 
        throw std::exception("Not Base64"); 

       w |= ((p - szEncodingChars) << nShift); 
      } 

      if ((nShift + 6) >= 8) 
      { 
       *pchOut++ = LOBYTE(w); 
       nBytesOut--; 
       w >>= 8; 
       nShift -= 8; 
      } 
     } 

     if (nBytesOut) 
      *pchOut++ = LOBYTE(w); 
    } 
    catch (std::exception&) 
    { 
     return 0; 
    } 

    return ((strSrc.length() * 6) + 7)/8; 
} 

다른 종속 관계 :

static const char kaDecodeLUT[256] = 
{ 
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, // 0-9 

    -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // A-O 
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, // P-Z 
    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // a-o 
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, // p-z 

    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 

    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
}; 

static BYTE CharToNibble(char ch) 
{ 
    char n = kaDecodeLUT[static_cast<BYTE>(ch)]; 
    if (n < 0) 
     throw std::exception("Not Base64"); 
    return static_cast<BYTE>(n); 
} 

나는이 질문에 대한 직접적인 대답은 아니라는 것을 알고,하지만 난 뭔가 말을했다 느꼈다. 당신이 선택한 알고리즘은 제가 본 최악의 경우입니다. 나는 그것이 당신에게 문제를 일으키는 경우 특히 그것에 많은 시간을 할애 할 가치가 있다고 생각하지 않습니다.

+0

답변 해 주셔서 감사합니다. 나는 또한 귀하의 알고리즘을 시도했지만 동일한 문제가 발생했습니다. –

+1

생산 코드를 게시했습니다. 어쩌면 문제는 발신자와있을 수 있습니다. –

+0

예, 문제는 인코딩 된 문자열 자체입니다. –