2 juncaijuncai juncaijuncai 于 2016.03.28 11:33 提问

url转换的时候缓冲区溢出,大神帮忙改一下,跪谢了 20C

char para[] = "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww&subject=订啊号:20160324001&total_fee=0.01";

char cDestDir[] = "";

int i = strlen(para);
CString stre = _T("");
stre.Format(_T("%d"),i);
MessageBox(stre);

UrlEncode(para,cDestDir,500,FALSE);

// CString str = _T("");
// char* str = "it is a test";
// str.Format("%s",str);
// ShellExecute ( NULL, NULL, cDestDir, NULL, NULL, SW_NORMAL );
// TODO: 在此添加控件通知处理程序代码

// char a[] = "This is a test";
CString str(cDestDir);
MessageBox(str);

ShellExecute ( NULL, NULL, str, NULL, NULL, SW_NORMAL );

1个回答

juncaijuncai
juncaijuncai   2016.03.28 11:33

BOOL UrlEncode(const char* szSrc, char* pBuf, int cbBufLen, BOOL bUpperCase)
{
if(szSrc == NULL || pBuf == NULL || cbBufLen <= 0)
return FALSE;

size_t len_ascii = strlen(szSrc);
if(len_ascii == 0)
{
    pBuf[0] = 0;
    return TRUE;
}

//先转换到UTF-8
char baseChar = bUpperCase ? 'A' : 'a';
int cchWideChar = MultiByteToWideChar(CP_ACP, 0, szSrc, len_ascii, NULL, 0);
LPWSTR pUnicode = (LPWSTR)malloc((cchWideChar + 1) * sizeof(WCHAR));
if(pUnicode == NULL)
    return FALSE;
MultiByteToWideChar(CP_ACP, 0, szSrc, len_ascii, pUnicode, cchWideChar + 1);

int cbUTF8 = WideCharToMultiByte(CP_UTF8, 0, pUnicode, cchWideChar, NULL, 0, NULL, NULL);
LPSTR pUTF8 = (LPSTR)malloc((cbUTF8 + 1) * sizeof(CHAR));
if(pUTF8 == NULL)
{
    free(pUnicode);
    return FALSE;
}
WideCharToMultiByte(CP_UTF8, 0, pUnicode, cchWideChar, pUTF8, cbUTF8 + 1, NULL, NULL);
pUTF8[cbUTF8] = '\0';

unsigned char c;
int cbDest = 0; //累加
unsigned char *pSrc = (unsigned char*)pUTF8;
unsigned char *pDest = (unsigned char*)pBuf;
while(*pSrc && cbDest < cbBufLen - 1)
{
    c = *pSrc;
    if(isalpha(c) || isdigit(c) || c == ';' || c == '/' || c == '?' || c == ':' || c =='@' || c =='&'|| c =='='|| c =='+'|| c =='$'|| c ==','|| c =='-'|| c =='_'|| c =='.'|| c =='!'|| c =='~'|| c =='*'|| c =='`'|| c =='('|| c ==')' )
    {
        *pDest = c;
        ++pDest;
        ++cbDest;
    }
    else if(c == ' ')
    {
        *pDest = '+';
        ++pDest;
        ++cbDest;
    }
    else
    {
        //检查缓冲区大小是否够用?
        if(cbDest + 3 > cbBufLen - 1)
            break;
        pDest[0] = '%';
        pDest[1] = (c >= 0xA0) ? ((c >> 4) - 10 + baseChar) : ((c >> 4) + '0');
        pDest[2] = ((c & 0xF) >= 0xA)? ((c & 0xF) - 10 + baseChar) : ((c & 0xF) + '0');
        pDest += 3;
        cbDest += 3;
    }
    ++pSrc;
}
//null-terminator
*pDest = '\0';
free(pUnicode);
free(pUTF8);
return TRUE;

}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!