c++字符串相關接口

c++字符串相關接口

    • 1.str2wstr(str轉換wstr)
    • 2.wstr2str(str轉換wstr)
    • 3.Utf8ToAsi(Utf8轉換ANSI)
    • 4.AsiToUtf8(ANSI轉換Utf8)
    • 5.stringformatA/stringformatW(按照指定的格式格式化字符串)
    • 6.GetStringBetween(獲取cStart cEnd之間的字符串)
    • 7.Char2Int(char轉int)
    • 8.Str2Bin(字符串轉換為二進制)
    • 9.BinToStr(二進制轉字符串)
    • 10.Trim(壓縮string兩邊的空格)
    • 11.GetBase64Value(獲取Base64的值)
    • 12.Base64Dec(Base64還原(解碼))
    • 13.Base64Dec(Base64加密)
    • 14.ConvertJsonToString(Json轉換string)
    • 15.EasyEnc/EasyDec 異或+7,異或-7
    • 16.TimeToStr/StrToTime(時間和字符串相互轉換)
    • 17.Split(字符串分割然后賦值給容器)
    • 18.GetJsonValue(從json中讀取value值)
    • 19.HexStr2Bin
    • 20.UrlDecode(url解碼)
    • 21.Base64Trim
    • 22.DecodeQuoted
    • 23.ToLower(字符串大寫換小寫)
    • 24.ToUpper(字符串小寫換大寫)
    • 25.stringreplace(字符串替換)
    • 26.StrWildcard(* ?的通配符比較)
    • 27.NetTools_IpString2Ip(將點分格式的字符串IP地址轉換為整數)
    • 28.NetTools_Ip2IpString(將整數IP地址轉換為點分格式的字符串IP地址)
    • 29.RandomString(根據類型生成隨機字符串)
    • 30.Utf8SubString

1.str2wstr(str轉換wstr)

#if	WS_PLATFORM == WS_PLATFORM_WIN32
std::wstring str2wstr( const std::string &strSrc, UINT CodePage/*=CP_ACP CP_UTF8*/ )
{if(strSrc.length() == 0)return L"";int buflen=MultiByteToWideChar( CodePage, 0, strSrc.c_str(), -1, NULL, 0 ) +1 ;if(buflen == 0)return L"";wchar_t * buf =  new wchar_t[buflen];std::wstring retn = L"";if (buf){memset(buf, 0, buflen * sizeof(wchar_t));::MultiByteToWideChar( CodePage, 0, strSrc.c_str(), -1, buf, buflen );retn = buf;delete []buf;}return retn;
}#elif    WS_PLATFORM == WS_PLATFORM_LINUX
std::wstring str2wstr( const std::string &strSrc, UINT CodePage)
{UNUSED(CodePage);if(strSrc.length() == 0)return L"";std::string strLocale = setlocale(LC_ALL, "");int buflen=mbstowcs(NULL, strSrc.c_str(), 0) + 1;if(buflen == 0)return L"";wchar_t * buf =  new wchar_t[buflen];std::wstring retn = L"";if (buf){memset(buf,0,  buflen * sizeof(wchar_t));mbstowcs(buf, strSrc.c_str(), strSrc.length());retn = buf;delete []buf;}setlocale(LC_ALL, strLocale.c_str());return retn;
}#endif

2.wstr2str(str轉換wstr)

#if	WS_PLATFORM == WS_PLATFORM_WIN32
std::string wstr2str( const std::wstring &wstrSrc, UINT CodePage/*=CP_ACP CP_UTF8*/)
{if(wstrSrc.length() == 0)return "";//得到轉化后需要Buf的長度std::string retn = "";try{int buflen = ::WideCharToMultiByte( CodePage, 0, wstrSrc.c_str(), -1, NULL, 0, NULL, NULL ) + 1;if(buflen == 0)return "";char * buf = new char[buflen];if(buf != NULL){memset(buf,0,  buflen );::WideCharToMultiByte( CodePage, 0, wstrSrc.c_str(), -1, buf, buflen, NULL, NULL );retn = buf;delete []buf;}}catch (...){}return retn;
}#elif    WS_PLATFORM == WS_PLATFORM_LINUX
std::string wstr2str( const std::wstring &wstrSrc, UINT CodePage)
{UNUSED(CodePage);if(wstrSrc.length() == 0)return "";//得到轉化后需要Buf的長度std::string retn = "";try{std::string strLocale = setlocale(LC_ALL, "");int buflen = wcstombs(NULL, wstrSrc.c_str(), 0) + 1;if(buflen == 0)return "";char * buf = new char[buflen];if(buf != NULL){memset(buf,0,  buflen );wcstombs(buf, wstrSrc.c_str(), buflen);retn = buf;delete []buf;}setlocale(LC_ALL, strLocale.c_str());}catch (...){}return retn;
}
#endif

3.Utf8ToAsi(Utf8轉換ANSI)

std::string Utf8ToAsi(std::string strUtf8)
{
#if	WS_PLATFORM == WS_PLATFORM_WIN32CWSByteArray baData;baData.Append(strUtf8.c_str());DWORD   UniCodeLen = ::MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1,   NULL, 0);std::vector <wchar_t>   vWCH(UniCodeLen);::MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, &vWCH[0], UniCodeLen);DWORD   dwASCIILen = ::WideCharToMultiByte(CP_ACP, 0, &vWCH[0], UniCodeLen, NULL, NULL, NULL, NULL);if(!dwASCIILen)return "";char*   pASCIIBuf = new char[dwASCIILen + 1];if(NULL == pASCIIBuf){return "";}memset(pASCIIBuf, 0, dwASCIILen + 1);::WideCharToMultiByte(CP_ACP, 0, &vWCH[0], UniCodeLen, pASCIIBuf, dwASCIILen, NULL, NULL);std::string szRetAsiic = pASCIIBuf;delete[] pASCIIBuf;return szRetAsiic;
#endifreturn strUtf8;
}

4.AsiToUtf8(ANSI轉換Utf8)

string AsiToUtf8(string strAsi)
{
#if	WS_PLATFORM == WS_PLATFORM_WIN32DWORD   UniCodeLen = ::MultiByteToWideChar(CP_ACP, 0, strAsi.c_str(), -1, NULL, 0);std::vector <wchar_t>   vWCH(UniCodeLen);::MultiByteToWideChar(CP_ACP, 0, strAsi.c_str(), -1, &vWCH[0], UniCodeLen);DWORD   dwUTF8Len = ::WideCharToMultiByte(CP_UTF8, 0, &vWCH[0], UniCodeLen, NULL, NULL, NULL, NULL);if(!dwUTF8Len)return "";char*   pUTF8Buf = new char[dwUTF8Len + 1];if(NULL == pUTF8Buf){return "";}memset(pUTF8Buf, 0, dwUTF8Len + 1);::WideCharToMultiByte(CP_UTF8, 0, &vWCH[0], UniCodeLen, pUTF8Buf, dwUTF8Len, NULL, NULL);std::string szRetUTF8 = pUTF8Buf;delete[] pUTF8Buf;return szRetUTF8;
#endifreturn strAsi;
}

5.stringformatA/stringformatW(按照指定的格式格式化字符串)

std::string  stringformatA(const char* fmt,   ...)
{  std::string s="";try{va_list   argptr;
#ifdef _WIN32
#pragma warning( push )
#pragma warning( disable : 4996 )
#endifva_start(argptr, fmt);int   bufsize = _vsnprintf(NULL, 0, fmt, argptr) + 1;va_end(argptr);char* buf=new char[bufsize];memset(buf, 0, bufsize);va_start(argptr, fmt);_vsnprintf(buf, bufsize, fmt, argptr);va_end(argptr);
#ifdef _WIN32
#pragma warning( pop )
#endifs=buf;delete[] buf;}catch(...){s="TryError!";}return   s;
}std::wstring  stringformatW(const wchar_t* fmt, ...)
{std::wstring s = L"";try{va_list   argptr;
#ifdef _WIN32
#pragma warning( push )
#pragma warning( disable : 4996 )
#endifva_start(argptr, fmt);int   bufsize = _vsnwprintf(NULL, 0, fmt, argptr) + 2;va_end(argptr);wchar_t* buf = new wchar_t[bufsize];memset(buf, 0, bufsize);va_start(argptr, fmt);_vsnwprintf(buf, bufsize,fmt, argptr);va_end(argptr);
#ifdef _WIN32
#pragma warning( pop )
#endifs = buf;delete[] buf;}catch (...){s = L"TryError!";}return   s;
}

6.GetStringBetween(獲取cStart cEnd之間的字符串)

std::string GetStringBetween(const char* cContent, const char* cStart, const char* cEnd)
{std::string strRe = "";char* cStartNow  = strstr((char*)cContent,cStart);if (NULL != cStartNow){cStartNow += strlen(cStart);strRe = cStartNow;char* iEnd = strstr(cStartNow,cEnd);if (NULL != iEnd){strRe.erase(iEnd-cStartNow);}}return strRe;
}//獲取cStart cEnd之間的字符串,限定范圍是:cContent+cStartNow iEnd之間
std::string GetStringBetweenEx(const char* cContent, char* cStart, char* cEnd,int cStartNowPos,int iEndPos)
{std::string strRe = "";char* cStartNow  = strstr((char*)(cContent+cStartNowPos),cStart);int cStartNowNow = 0;if ((NULL != cStartNow)&&((cContent+iEndPos)>cStartNow)){cStartNowNow = (int)(cStartNow - cContent);strRe.append(cStartNow,iEndPos-cStartNowNow);///<只寫入部分數據char* iEnd = strstr(cStartNow,cEnd);if (NULL != iEnd){strRe.erase(iEnd-cStartNow);}strRe.erase(0,strlen(cStart));}return strRe;
}

7.Char2Int(char轉int)

char Char2Int(char ch){if(ch>='0' && ch<='9')return (char)(ch-'0');if(ch>='a' && ch<='f')return (char)(ch-'a'+10);if(ch>='A' && ch<='F')return (char)(ch-'A'+10);return -1;}

8.Str2Bin(字符串轉換為二進制)

char Str2Bin(char *str)
{char tempWord[2];char chn;tempWord[0] = Char2Int(str[0]);///<make the B to 11 -- 00001011tempWord[1] = Char2Int(str[1]); ///<make the 0 to 0  -- 00000000chn = (tempWord[0] << 4) | tempWord[1];///<to change the BO to 10110000return chn;
}size_t StrToBin(const string &strStr, CWSByteArray &arrBin)
{size_t iLen = 0;unsigned int nSingle = 0;BYTE bSingle = 0;char cSingle[4];arrBin.RemoveAll();for(iLen = 0; iLen<(size_t)strStr.length(); iLen+=2){memset(cSingle, 0, sizeof(cSingle));strncpy_s(cSingle, sizeof(cSingle),strStr.c_str() + iLen, 2);sscanf_s(cSingle, "%02X", &nSingle);bSingle = (BYTE)nSingle;arrBin.Add(bSingle);}return arrBin.GetCount();
}

9.BinToStr(二進制轉字符串)

size_t BinToStr(CWSByteArray &arrBin, string &strStr)
{return BinToStr(arrBin.GetData(), arrBin.GetCount(), strStr);
}size_t BinToStr(const BYTE* pBuffer, size_t nSize, string &strStr)
{size_t iLen = 0;BYTE bSingle = 0;char cSingle[3];strStr = "";for(iLen = 0; iLen<nSize; iLen++){bSingle = *(pBuffer+iLen);memset(cSingle, 0, sizeof(cSingle));sprintf_s(cSingle,sizeof(cSingle), "%02X", bSingle);strStr += cSingle;}return strStr.length();
}

10.Trim(壓縮string兩邊的空格)

std::string trimLeft(const std::string& str)
{std::string strRet = str;for (std::string::iterator iter = strRet.begin(); iter != strRet.end(); ++iter){if (!isspace(*iter)){strRet.erase(strRet.begin(), iter);break;}}return strRet;
}std::string trimRight(const std::string& str)
{if (str.begin() == str.end()){return str;}std::string strRet = str;for (std::string::iterator iter = strRet.end() - 1; iter != strRet.begin(); --iter){if (!isspace(*iter)){strRet.erase(iter + 1, strRet.end());break;}}return strRet;
}//string 的trim 函數 ,干掉頭尾空格
std::string Trim(const std::string& str){if(str.empty())return "";std::string strRet = str;std::string::iterator iter;for (iter = strRet.begin(); iter != strRet.end(); ++iter){if (!isspace(*iter)){strRet.erase(strRet.begin(), iter);break;}}if (iter == strRet.end()){return strRet;}for (iter = strRet.end() - 1; iter != strRet.begin(); ++iter){if (!isspace(*iter)) {strRet.erase(iter + 1, strRet.end());break;}}return strRet;
}

11.GetBase64Value(獲取Base64的值)

char GetBase64Value(char ch)
{if ((ch >= 'A') && (ch <= 'Z')) return ch - 'A'; if ((ch >= 'a') && (ch <= 'z')) return ch - 'a' + 26; if ((ch >= '0') && (ch <= '9')) return ch - '0' + 52; switch (ch) { case '+': return 62; case '/': return 63; case '=': /* base64 padding */ return 0; default: return 0; } 
}

12.Base64Dec(Base64還原(解碼))

int Base64Dec(char *buf,char*text,int size) 
{if(size%4) return 0;unsigned char chunk[4];int parsenum=0;while(size>0){chunk[0] = GetBase64Value(text[0]); chunk[1] = GetBase64Value(text[1]); chunk[2] = GetBase64Value(text[2]); chunk[3] = GetBase64Value(text[3]); *buf++ = (chunk[0] << 2) | (chunk[1] >> 4); *buf++ = (chunk[1] << 4) | (chunk[2] >> 2); *buf++ = (chunk[2] << 6) | (chunk[3]);text+=4;size-=4;parsenum+=3;}return parsenum;
}
int Base64Decode(const std::string& strB64, char* pOutput,int iBufferSize)
{int iB64Len=(int)strB64.size();//檢查是否是4的整數倍if(iB64Len == 0 || iB64Len%4) return 0;//檢查輸出緩沖區是不是正確int iBINLen=iB64Len*3/4;if (strB64[strB64.size()-1]=='='){iBINLen--;}if (strB64[strB64.size()-2]=='='){iBINLen--;}if (iBufferSize<iBINLen) return iBINLen;if(NULL==pOutput) return 0;unsigned char chunk[4];int parsenum=0;int iNowPos=0;while(iNowPos<iB64Len){chunk[0] = GetBase64Value(strB64[iNowPos]); chunk[1] = GetBase64Value(strB64[iNowPos+1]); chunk[2] = GetBase64Value(strB64[iNowPos+2]); chunk[3] = GetBase64Value(strB64[iNowPos+3]); *pOutput++ = (chunk[0] << 2) | (chunk[1] >> 4); *pOutput++ = (chunk[1] << 4) | (chunk[2] >> 2); *pOutput++ = (chunk[2] << 6) | (chunk[3]);iNowPos+=4;parsenum+=3;}if (iNowPos>0 && strB64[iNowPos-4+3]=='='){parsenum--;}if (iNowPos>1 && strB64[iNowPos-4+2]=='='){parsenum--;}return parsenum;
}

13.Base64Dec(Base64加密)

int Base64Enc(char *pOutBuf, char *pInput, int iSize) 
{ const char *cBase64_Encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";int iBuflen = 0; int c1 =0,c2 =0,c3 =0;while(iSize>0){if(iSize>2){c1 = pInput[0] & 0xFF;c2 = pInput[1] & 0xFF;c3 = pInput[2] & 0xFF;*pOutBuf++ = cBase64_Encoding[(c1 & 0xFC) >> 2];*pOutBuf++ = cBase64_Encoding[((c1 & 0x03) << 4) | ((c2 & 0xF0) >> 4)];*pOutBuf++ = cBase64_Encoding[((c2 & 0x0F) << 2) | ((c3 & 0xC0) >> 6)];*pOutBuf++ = cBase64_Encoding[c3 & 0x3F];}else{switch(iSize){case 1:c1 = pInput[0] & 0xFF;*pOutBuf++ = cBase64_Encoding[ (c1 & 0xFC) >> 2];*pOutBuf++ = cBase64_Encoding[((c1 & 0x03) << 4)];*pOutBuf++ = '=';*pOutBuf++ = '=';break;case 2: c1 = pInput[0] & 0xFF;c2 = pInput[1] & 0xFF;*pOutBuf++ = cBase64_Encoding[(c1 & 0xFC) >> 2];*pOutBuf++ = cBase64_Encoding[((c1 & 0x03) << 4) | ((c2 & 0xF0) >> 4)]; *pOutBuf++ = cBase64_Encoding[((c2 & 0x0F) << 2)]; *pOutBuf++ = '='; break; } } pInput +=3; iSize -=3; iBuflen +=4; } *pOutBuf = 0; return iBuflen; 
} int Base64Encode(char* pInput,int iSize,std::string& strB64)
{const char *cBase64_Encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";int iBuflen = 0; int c1 =0,c2 =0,c3 =0;if(NULL==pInput) return 0;if(0==iSize) return 0;while(iSize>0){if(iSize>2){c1 = pInput[0] & 0xFF;c2 = pInput[1] & 0xFF;c3 = pInput[2] & 0xFF;strB64 += cBase64_Encoding[(c1 & 0xFC) >> 2];strB64 += cBase64_Encoding[((c1 & 0x03) << 4) | ((c2 & 0xF0) >> 4)];strB64 += cBase64_Encoding[((c2 & 0x0F) << 2) | ((c3 & 0xC0) >> 6)];strB64 += cBase64_Encoding[c3 & 0x3F];}else{switch(iSize){case 1:c1 = pInput[0] & 0xFF;strB64 += cBase64_Encoding[ (c1 & 0xFC) >> 2];strB64 += cBase64_Encoding[((c1 & 0x03) << 4)];strB64 += '=';strB64 += '=';break;case 2: c1 = pInput[0] & 0xFF;c2 = pInput[1] & 0xFF;strB64 += cBase64_Encoding[(c1 & 0xFC) >> 2];strB64 += cBase64_Encoding[((c1 & 0x03) << 4) | ((c2 & 0xF0) >> 4)]; strB64 += cBase64_Encoding[((c2 & 0x0F) << 2)]; strB64 += '='; break; } } pInput +=3; iSize -=3; iBuflen +=4; } //*pOutBuf = 0; return iBuflen; 
}

14.ConvertJsonToString(Json轉換string)

void ConvertJsonToString(Value *pValue, string &strJson)
{//將doc對象的值寫入字符串StringBuffer buffer;  Writer<StringBuffer> writer(buffer);pValue->Accept(writer);strJson = buffer.GetString();
}std::string ConvertJsonToString(Value &pValue)
{StringBuffer buffer;Writer<StringBuffer> writer(buffer);pValue.Accept(writer);return string(buffer.GetString());
}

15.EasyEnc/EasyDec 異或+7,異或-7

//異或+7
string EasyEnc(string strKey, string strIn)
{string strOut = "";char cSingle[3] = {0};unsigned char bSingle = '0';size_t nKeyLen = strKey.length();for (size_t nIndex=0; nIndex<strIn.length(); nIndex++){//加密,異或+7bSingle = (strIn.at(nIndex)^strKey.at(nIndex%nKeyLen))+7;//bin轉strmemset(cSingle, 0, sizeof(cSingle));snprintf(cSingle, 3, "%02X", bSingle);strOut += cSingle;}return strOut;
}//異或-7
string EasyDec(string strKey, string strIn)
{string strOut = "";unsigned int nSingle = 0;unsigned char bSingle = '0';char cSingle[3] = {0};size_t nKeyLen = strKey.length();for (size_t nIndex=0; nIndex<strIn.length(); nIndex += 2){//str轉binmemset(cSingle,0,sizeof(cSingle));strncpy_s(cSingle, sizeof(cSingle), strIn.c_str()+nIndex, 2);sscanf_s(cSingle, "%02X", &nSingle);//解密,異或-7bSingle = (unsigned char)(nSingle-7)^strKey.at((nIndex/2)%nKeyLen);strOut += bSingle;}return strOut;
}

16.TimeToStr/StrToTime(時間和字符串相互轉換)

std::string TimeToStr(time_t t)
{std::string strRe = "2000-01-01 00:00:00";if (0 == t) return strRe;struct tm newtime;memset(&newtime, 0, sizeof(newtime));localtime_s(&newtime, &t);if (newtime.tm_year > 0){strRe = stringformatA("%04d-%02d-%02d %02d:%02d:%02d",newtime.tm_year + 1900, newtime.tm_mon + 1, newtime.tm_mday,newtime.tm_hour, newtime.tm_min, newtime.tm_sec);}return strRe;
}time_t StrToTime(const char *strString)
{time_t timeRe = 0;char *pPos = strstr((char*)strString, "-");if (pPos == NULL){return timeRe;}int iYear = std::atoi(strString);int iMonth = std::atoi(pPos + 1);pPos = strstr(pPos + 1, "-");if (pPos == NULL){return timeRe;}int iDay = atoi(pPos + 1);int iHour = 0;int iMin = 0;int iSec = 0;pPos = strstr(pPos + 1, " ");//為了兼容有些沒精確到時分秒的if (pPos != NULL){iHour = atoi(pPos + 1);pPos = strstr(pPos + 1, ":");if (pPos != NULL){iMin = atoi(pPos + 1);pPos = strstr(pPos + 1, ":");if (pPos != NULL){iSec = atoi(pPos + 1);}}}struct tm sourcedate;memset((void*)&sourcedate, 0, sizeof(sourcedate));sourcedate.tm_sec = iSec;sourcedate.tm_min = iMin;sourcedate.tm_hour = iHour;sourcedate.tm_mday = iDay;sourcedate.tm_mon = iMonth - 1;sourcedate.tm_year = iYear - 1900;timeRe = _mktime64(&sourcedate);return timeRe;
}

17.Split(字符串分割然后賦值給容器)

/// @fn void Split(const std::string& strInput, const std::string& strSep, std::vector<std::string> &vecSeg);
/// @brief  字符串分割然后賦值給容器
/// @param const std::string& strInput 傳入賦值給容器的字符
/// @param const std::string& strSep  傳入給容器字符內容的下標數
/// @param std::vector<std::string> &vecSeg  所要賦值的容器
/// @return 得到數值
/// @retval 返回需要的字符串
/// @note
void Split(const std::string& strInput, const std::string& strSep, std::vector<std::string> &vecSeg)
{std::string strTemp = "";if(strInput.empty() || strSep.empty())return;vecSeg.clear();vecSeg.reserve(strInput.size()/2);size_t nStart = 0;size_t nPos = std::string::npos;do{nPos = strInput.find(strSep,nStart);strTemp = strInput.substr(nStart,nPos-nStart);if (strTemp.length() > 0){vecSeg.push_back(strTemp);}nStart = nPos + strSep.size();}while(nPos!=std::string::npos);
}/// @fn void Split(const std::wstring &strInput, const std::wstring &strSep, vector<std::wstring> &vecSeg);
/// @brief  字符串分割然后賦值給容器
/// @param const std::wstring& strInput 傳入賦值給容器的字符
/// @param const std::wstring& strSep  傳入給容器字符內容的下標數
/// @param std::vector<std::wstring> &vecSeg  所要賦值的容器
/// @retval 返回需要的字符串
void Split(const std::wstring &strInput, const std::wstring &strSep, std::vector<std::wstring> &vecSeg)
{wstring strTemp = L"";if(strInput.empty() || strSep.empty())return;vecSeg.clear();vecSeg.reserve(strInput.size()/2);size_t nStart = 0;size_t nPos = string::npos;do{nPos = strInput.find(strSep, nStart);strTemp = strInput.substr(nStart, nPos-nStart);if (strTemp.length() > 0){vecSeg.push_back(strTemp);}nStart = nPos + strSep.size();}while(nPos != string::npos);
}

18.GetJsonValue(從json中讀取value值)

std::string GetJsonValue(const std::string& str, const std::string& strKey)
{string strRet = "";Document doc;doc.Parse(str.c_str());if(doc.HasParseError()){return strRet;}if(!doc.HasMember(strKey.c_str())){TRACKERROR("str = %s NO Field(%s)!", str.c_str(), strKey.c_str());return strRet;}ConvertJsonToString(&doc[strKey.c_str()],strRet);if(strRet.find_first_of("\"") == 0){strRet.erase(strRet.begin());strRet.erase(strRet.end() - 1);}return strRet;
}

19.HexStr2Bin

/// @fn int HexStr2Bin(unsigned char *pBinStr, int nMaxOutLen, const char *pszHexStr, int nHexLen);
/// @brief Base6416進制存儲bin文件
/// @param unsigned char *pBinStr 接收文件
/// @param int nMaxOutLen 最大值數
/// @param const char *pszHexStr 被復制的
/// @param int nHexLen 循環次數
/// @return 得到數值
int HexStr2Bin(unsigned char *pBinStr, int nMaxOutLen, const char *pszHexStr, int nHexLen)
{if (NULL == pBinStr || NULL == pszHexStr){return -1;}if (nMaxOutLen <= 0 || nHexLen <= 0 || nHexLen % 2 || nMaxOutLen < nHexLen / 2){return -1;}unsigned int dwSingle = 0;char cSingle[3];int nOutLen = 0;for (int i = 0; i < nHexLen; i += 2){memset(cSingle, 0, sizeof(cSingle));strncpy_s(cSingle, sizeof(cSingle), (char *)pszHexStr + i, 2);sscanf_s(cSingle, "%02X", &dwSingle);pBinStr[nOutLen++] = dwSingle;}return nOutLen;
}

20.UrlDecode(url解碼)

std::string UrlDecode(std::string strForDec)
{//1. base64解碼//2.utf8 1/2/3解碼//3. Unicode解碼std::string output="";DWORD dwCodeType =CODETYPE_UNKNOWN;//#pragma region 1. base64解碼const static int iCount = 8;const string strAryTemp[iCount]={ "=?utf-8?B?", "=?UTF-8?B?","=?gb2312?B?", "=?GB2312?B?","=?gbk?B?","=?GBK?B?","=?UTF8?B?","=?utf8?B?"};size_t offset;int iIndex = 0;bool bNeedBase64Dec = false;for(; !bNeedBase64Dec && iIndex < iCount; iIndex++){offset = strForDec.find(strAryTemp[iIndex]);if ( string::npos != offset){bNeedBase64Dec = true;break;}}bool bUsedBase64Dec = false;for ( ; bNeedBase64Dec;){string strTemp = GetStringBetween(strForDec.c_str(),(char *)strAryTemp[iIndex].c_str(),"?=");int iLength = (int)strTemp.length();assert(iLength > 0);char *pOutBuffer = new char[iLength];if ( pOutBuffer == NULL ){return "";}memset(pOutBuffer, 0, iLength);if (Base64Decode(strTemp,pOutBuffer, iLength )>0){strForDec.erase( offset, strAryTemp[iIndex].length() + iLength + 2);strForDec.insert( offset, pOutBuffer);bUsedBase64Dec = true;delete []pOutBuffer;}else{delete []pOutBuffer;return "";}offset = strForDec.find(strAryTemp[iIndex]);bNeedBase64Dec = string::npos != offset;}
//#pragma endregion 1. base64解碼if ( bUsedBase64Dec ){output = strForDec;if ( lstrcmpiA(strAryTemp[iIndex].c_str(), "=?utf-8?B?")==0 ){dwCodeType = CODETYPE_UTF8_OK;}}//2.utf8 1/2/3解碼else{dwCodeType =CODETYPE_UTF8_UNKNOWN;size_t nlen =strForDec.length();size_t nIndex = 0;char tmp[2];char ctmp;int iUtf8Type = 2;int iUtf8Count = 0;while(nIndex<nlen){if(strForDec[nIndex]=='%' && nIndex <(nlen-2)){tmp[0]=strForDec[nIndex+1];tmp[1]=strForDec[nIndex+2];ctmp = Str2Bin(tmp);output+=ctmp;nIndex=nIndex+3;
//#pragma region 只是對字節數判斷if (0 == iUtf8Count){//3字節if ((ctmp&0xF0)==0xE0){iUtf8Type = 3;if (dwCodeType == CODETYPE_UTF8_UNKNOWN){dwCodeType = CODETYPE_UTF8_OK;}}//2字節else if ( ((ctmp&0xF0)==0xC0) || ((ctmp&0xF0)==0xD0)){iUtf8Type = 2;if (dwCodeType == CODETYPE_UTF8_UNKNOWN){dwCodeType = CODETYPE_UTF8_OK;}}else if( !(ctmp & 0x80) )	//1字節 0xxxxxxx{iUtf8Type = 1;	// add by ybx 2012-11-03if (dwCodeType == CODETYPE_UTF8_UNKNOWN){dwCodeType = CODETYPE_UTF8_OK;}}else{dwCodeType = CODETYPE_UTF8_ERROR;}}iUtf8Count++;if (iUtf8Count == iUtf8Type) iUtf8Count = 0;
//#pragma endregion 只是對字節數判斷}else if(strForDec[nIndex]=='+'){output+=' ';iUtf8Count = 0;nIndex++;}else{output+=strForDec[nIndex];iUtf8Count = 0;nIndex++;}}}//3. Unicode解碼if (CODETYPE_UTF8_OK == dwCodeType){wstring woutput = L"";size_t nlen = output.length();size_t i = 0;wchar_t  tTemp[2];while(i<nlen){if (((output[i]&0xF0)==0xE0)&&((i+2)<nlen)){///UTF8->UnicodeBYTE b1 = ((output[i+0] & 0x0f) <<4) + ((output[i+1] & 0x3c) >>2);BYTE b2 = ((output[i+1] & 0x03) <<6) + (output[i+2] & 0x3f);tTemp[0]=b1*0x100+b2;tTemp[1]=L'\0';woutput += tTemp;i+=3;}else if ((((output[i]&0xF0)==0xC0)||((output[i]&0xF0)==0xD0))&&((i+1)<nlen)){///UTF8->UnicodeBYTE b1 = (UCHAR)((output[i]) & 0x1f) >> 2;BYTE b2 = ((UCHAR)((output[i]) & 0x1f) << 6) | (output[i+1] & 0x3f);tTemp[0]=b1*0x100+b2;tTemp[1]=L'\0';woutput += tTemp;i+=2;}else{tTemp[0]=output[i];tTemp[1]=L'\0';woutput += tTemp;i++;}}output = wstr2str(woutput.c_str(), CP_UTF8);}return output;
}int Base64Decode(const std::string& strB64, char* pOutput,int iBufferSize)
{int iB64Len=(int)strB64.size();//檢查是否是4的整數倍if(iB64Len == 0 || iB64Len%4) return 0;//檢查輸出緩沖區是不是正確int iBINLen=iB64Len*3/4;if (strB64[strB64.size()-1]=='='){iBINLen--;}if (strB64[strB64.size()-2]=='='){iBINLen--;}if (iBufferSize<iBINLen) return iBINLen;if(NULL==pOutput) return 0;unsigned char chunk[4];int parsenum=0;int iNowPos=0;while(iNowPos<iB64Len){chunk[0] = GetBase64Value(strB64[iNowPos]); chunk[1] = GetBase64Value(strB64[iNowPos+1]); chunk[2] = GetBase64Value(strB64[iNowPos+2]); chunk[3] = GetBase64Value(strB64[iNowPos+3]); *pOutput++ = (chunk[0] << 2) | (chunk[1] >> 4); *pOutput++ = (chunk[1] << 4) | (chunk[2] >> 2); *pOutput++ = (chunk[2] << 6) | (chunk[3]);iNowPos+=4;parsenum+=3;}if (iNowPos>0 && strB64[iNowPos-4+3]=='='){parsenum--;}if (iNowPos>1 && strB64[iNowPos-4+2]=='='){parsenum--;}return parsenum;
}

21.Base64Trim

/// @fn void Base64Trim(std::string& str);
/// @brief 去除Base64編碼字符串開頭和結尾兩端的空格
/// @param std::string& str
/// @return 得到數值
void Base64Trim(string &str)
{size_t iposfront = 0;size_t iposback = 0;std::string str64Char = base64Char;str64Char += "=";for( ;iposback < str.size(); ++iposback){if ( std::string::npos == str64Char.find((char)str.at(iposback))){continue;}str.replace(iposfront, 1, 1, str.at(iposback));++iposfront;}str.erase(iposfront, str.size() - iposfront);
}

22.DecodeQuoted

string DecodeQuoted(const string &strSrc)
{INT_PTR iSrcSize = strSrc.size();const char *pByteSrc = (char*)strSrc.data();char * pDes = new char[iSrcSize];memset(pDes,0, iSrcSize);char * pTemp = pDes;INT_PTR i = 0;int iSize = 0;while(i < iSrcSize){if (strncmp(pByteSrc, "=\r\n", 3) == 0)        // 軟回車,跳過{pByteSrc += 3;i += 3;}else{if (*pByteSrc == '=')        // 是編碼字節{sscanf_s(pByteSrc, "=%02X", reinterpret_cast<unsigned int *>(pTemp));pTemp++;pByteSrc += 3;i += 3;}else        // 非編碼字節{*pTemp++ = (unsigned char)*pByteSrc++;i++;}++iSize;}}std::string result(pDes, iSize);delete []pDes;pDes = NULL;return result;
}

23.ToLower(字符串大寫換小寫)

std::string ToLower(const std::string& strIn)
{std::string strTmp = strIn;for(size_t i=0; i<strTmp.size(); ++i){char& c = strTmp[i];if(c >= 'A' && c <= 'Z')c |= 32;}return strTmp;
}std::wstring ToLower(const std::wstring& strIn)
{std::wstring strTmp = strIn;for(size_t i=0; i<strTmp.size(); ++i){wchar_t& c = strTmp[i];if(c >= L'A' && c <= L'Z')c|=32;}return strTmp;
}

24.ToUpper(字符串小寫換大寫)

std::string ToUpper(const std::string& strIn)
{std::string strTmp = strIn;for(size_t i=0; i<strTmp.size(); ++i){char& c = strTmp[i];if(c >= 'a' && c <= 'z')c &= 0xdf;}return strTmp;
}std::wstring ToUpper(const std::wstring& strIn)
{std::wstring strTmp = strIn;for(size_t i=0; i<strTmp.size(); ++i){wchar_t& c = strTmp[i];if(c >= L'A' && c <= L'Z')c &= 0xdf;}return strTmp;
}

25.stringreplace(字符串替換)

int stringreplace(std::string& strString, const char* src, const char* target)
{size_t nLen = 0;int iPos = 0;int iCount = 0;while (nLen < strString.length()){iPos = (int)strString.find(src, nLen);if (iPos >= 0){//找到了iCount++;strString.replace(iPos, strlen(src), target);nLen = iPos + strlen(target);}else{break;}}return iCount;
}

26.StrWildcard(* ?的通配符比較)

BOOL StrWildcard(const char *pat, const char *str)
{while(*str && *pat){if(*pat == '?'){if(StrWildcard(pat+1, str)) return TRUE;str++;pat++;}else if(*pat == '*'){while(*pat == '*' || *pat == '?') pat++;if(!*pat) return TRUE;while(*str){if(StrWildcard(pat, str)) return TRUE;str++;}return FALSE;}else{if(*pat!=*str) return FALSE;str++;pat++;}}if(*str!=0) return FALSE;while(*pat == '*' || *pat == '?') pat++;return !*pat;
}

27.NetTools_IpString2Ip(將點分格式的字符串IP地址轉換為整數)

LONGLONG NetTools_IpString2Ip(const std::string& strRe, BOOL ipv6)
{LONGLONG ullIp = 0;int bIP[8];if (0 == strRe.length()){return 0;}if (ipv6){//ipV6sscanf_s(strRe.c_str(), "%d.%d.%d.%d.%d.%d", &bIP[5], &bIP[4], &bIP[3], &bIP[2], &bIP[1], &bIP[0]);ullIp = ((LONGLONG)bIP[5] << 40) | ((LONGLONG)bIP[4] << 32) | ((LONGLONG)bIP[3] << 24) | ((LONGLONG)bIP[2] << 16) | ((LONGLONG)bIP[1] << 8) | (LONGLONG)bIP[0];}else{//ipV4sscanf_s(strRe.c_str(), "%d.%d.%d.%d", &bIP[3], &bIP[2], &bIP[1], &bIP[0]);ullIp = ((LONGLONG)bIP[3] << 24) | ((LONGLONG)bIP[2] << 16) | ((LONGLONG)bIP[1] << 8) | (LONGLONG)bIP[0];}return ullIp;
}

28.NetTools_Ip2IpString(將整數IP地址轉換為點分格式的字符串IP地址)

std::string NetTools_Ip2IpString(LONGLONG llIp, BOOL ipv6)
{BYTE			bIP[6];std::string	strRe;bIP[0] = (BYTE)((llIp >> (8 * 0)) & (BYTE)0xff);bIP[1] = (BYTE)((llIp >> (8 * 1)) & (BYTE)0xff);bIP[2] = (BYTE)((llIp >> (8 * 2)) & (BYTE)0xff);bIP[3] = (BYTE)((llIp >> (8 * 3)) & (BYTE)0xff);if (ipv6){//ipV6bIP[4] = (BYTE)((llIp >> (8 * 4)) & (BYTE)0xff);bIP[5] = (BYTE)((llIp >> (8 * 5)) & (BYTE)0xff);strRe = stringformatA("%d.%d.%d.%d.%d.%d", bIP[5], bIP[4], bIP[3], bIP[2], bIP[1], bIP[0]);}else{//ipV4strRe = stringformatA("%d.%d.%d.%d", bIP[3], bIP[2], bIP[1], bIP[0]);}return strRe;
}

29.RandomString(根據類型生成隨機字符串)

std::string RandomString(DWORD dwStrLen, DWORD dwType, DWORD dwSrand)
{std::string strRand = "";char cRand;DWORD dwLen = 0;srand((unsigned)time(NULL) + dwSrand);while (dwLen < dwStrLen){cRand = rand() % 128;if (_UPPER&dwType){//<大寫字母if (isupper(cRand)) { strRand += cRand; dwLen++; continue; }}if (_LOWER&dwType){//<小寫字母if (islower(cRand)) { strRand += cRand; dwLen++; continue; }}if (_DIGIT&dwType){//<數字if (isdigit(cRand)) { strRand += cRand; dwLen++; continue; }}if (_PUNCT&dwType){//<特殊字符if (ispunct(cRand)) { strRand += cRand; dwLen++; continue; }}}return strRand;
}

30.Utf8SubString

//返回str中的一個UTF-8編碼的子字符串,從位置nStart開始,長度為nLength。
std::string Utf8SubString(const std::string &str, size_t nStart, size_t nLength)
{if (nLength == 0 || nStart > str.size()){return std::string();}if (nLength == std::string::npos){return str.substr(nStart, std::string::npos);}size_t i = 0, j = 0;size_t nMin = std::string::npos;size_t nMax = std::string::npos;for (i = 0, j = 0; i < str.size(); i++, j++){if (j == nStart){nMin = i;}if (i <= nStart + nLength ){nMax = i;}else{break;}unsigned char  byte = str[i];if (byte < 128){i += 0;}else if ((byte & 0xE0) == 0xC0){i += 1;}else if ((byte & 0xF0) == 0xE0){i += 2;}else if ((byte & 0xF8) == 0xF0){i += 3;}else{return std::string();}}if (j <= nStart + nLength){nMax = i;}return  str.substr(nMin, nMax);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20435.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20435.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20435.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

視覺語言大模型llava學習

1. 拉取 https://github.com/haotian-liu/LLaVA 視覺語言大模型是人工智能領域一種重要的多模態模型&#xff0c;它結合了計算機視覺&#xff08;CV&#xff09;和自然語言處理&#xff08;NLP&#xff09;的技術&#xff0c;使得模型能夠同時理解圖像和文本信息。這類模型在多…

hadoop部署

需要3臺機子&#xff0c;Linux為centos7 分別設置靜態ip&#xff0c;設置主機名,配置主機名映射&#xff0c;配置ssh免密登入 hadoop1 192.168.1.7 hadoop2 192.168.1.8 hadoop3 192.168.1.9 vi /etc/sysconfig/network-scripts/ifcfg-ens33TYPE"Ethernet" PROX…

Kotlin 泛型

文章目錄 定義泛型屬性泛型函數泛型類或接口 where 聲明多個約束泛型具體化in、out 限制泛型輸入輸出 定義 有時候我們會有這樣的需求&#xff1a;一個類可以操作某一類型的對象&#xff0c;并且限定只有該類型的參數才能執行相關的操作。 如果我們直接指定該類型Int&#xff…

機器人抓取檢測(Robot Grasping Detection)

目錄 前言 一、物體檢測 二、抓取點生成 三、運動規劃 四、控制 五、總結 前言 機器人抓取檢測&#xff08;Robot Grasping Detection&#xff09;是指通過計算機視覺和機器學習技術&#xff0c;自動識別并確定機器人如何抓取物體的一種技術。這個過程涉及多個步驟和關鍵…

【Python系列】Python 中方法定義與方法調用詳解

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

詳細介紹運算符重載函數,清晰明了

祝各位六一快樂~ 前言 1.為什么要進行運算符重載&#xff1f; C中預定義的運算符的操作對象只能是基本數據類型。但實際上&#xff0c;對于許多用戶自定義類型&#xff08;例如類&#xff09;&#xff0c;也需要類似的運算操作。這時就必須在C中重新定義這些運算符&#xff…

短信發送驗證碼及郵件發送驗證碼

發送短信驗證碼 阿里云發送驗證碼 public Integer sendTelCode(String tel) {String url "https://dfsns.market.alicloudapi.com/data/send_sms";String appcode "a3198282fbdf443d97aa9f3cfbe1232e";int code RandomUtil.randomInt(1000,10000);emai…

【DSP】xDAIS算法標準

1. 簡介 在安裝DSP開發支持包時&#xff0c;有名為 “xdais_7_21_01_07”文件夾。xDAIS全稱: TMS320 DSP Algorithm Standard(算法標準)。39條規則&#xff0c;15條指南。參考文檔。參考文章。 2. 三個層次 3.接口 XDAIS Digital Media。編解碼引擎。VISA&#xff08;Video&…

LeetCode前端刷題指南:探索四大領域,精通五大技能,掌握六大題型,運用七大策略

LeetCode前端刷題指南&#xff1a;探索四大領域&#xff0c;精通五大技能&#xff0c;掌握六大題型&#xff0c;運用七大策略 在前端開發的廣闊領域中&#xff0c;刷題是提高自身能力、深入理解算法和數據結構的重要途徑。LeetCode作為知名的在線刷題平臺&#xff0c;為前端開…

牛客小白月賽95VP

早上藍橋杯大寄&#xff0c;算是交了300元買了件T恤qaq 1.簽到&#xff1a;https://ac.nowcoder.com/acm/contest/83687/A 下面是AC代碼&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int a,b;cin>>a>>b;if(ab) cout<<&quo…

簡述你對 SPA 單??的理解,它的優缺點分別是什么 ?

SPA&#xff08;Single-Page Application&#xff0c;單頁應用&#xff09;是一種在Web開發中廣泛使用的應用架構模式。它允許用戶通過交互操作來更新頁面的部分內容&#xff0c;而無需重新加載整個頁面。以下是關于SPA的理解、優點和缺點的簡要說明。 SPA的理解 SPA的核心思…

qi5uxeel算法分析流程記錄libmsec.so

動態注冊函數主要方法在so層。 libmsec.so 通過regsiterNative方法注冊62個函數 加殼混淆ollvm動態反調試等你還能再惡心點不 分析流程定位關鍵點 算法設計SM4以及各類自定義簽名算法 涉及到的知識包含Java C Android 完整混淆流程如下圖&#xff0c; 不得不說你開發的…

微信小程序canvas畫圖使用百分比適配不同機型屏幕達到任何屏幕比例皆可!完美適配任何機型!指定canvas尺寸適配亦可!保證全網唯一完美

錯誤代碼示例: // 在onLoad中調用 const that = this wx.getSystemInfo({success: function (res) {console.log(res)that.setData({model: res.model,screen_width: res.windowWidth/375,screen_height: res.windowHeight})} }) 我看到網上很多使用上面這種代碼去適配,其…

C語言 指針——函數指針

目錄 什么是函數指針&#xff1f; 函數指針的定義 定義函數指針時的常見錯誤 函數指針有什么用&#xff1f; 函數指針的主要應用 什么是函數指針&#xff1f; 函數指針 (Function Pointer) 就是指向函數的指針變量 數據類型 ( * 指針變量名 ) ( 形參列表 ); 例如&#x…

【回眸】牛客網刷刷刷(九) ——面試經驗篇(含參考回答)

前言 度過了忙碌的4個月&#xff0c;經歷了加班、籌備wedding、更新簡歷&#xff0c;終于有些許喘息時間。 下面的規劃比較簡單&#xff0c;一個是備考3個月后的雅思&#xff0c;一個是積累牛客網沖浪經驗&#xff0c;最后一個是記錄工作交接項。 牛客網刷刷刷這個系列也終于迎…

el-date-picker 選擇日期范圍只保存左側日期面板

需求 日期篩選&#xff0c;但限制只能選擇同一個月的數據&#xff0c;故此應該去掉右側月份面板。 實現 主要是通過 css 樣式實現&#xff1a; <style> /* 隱藏右邊日期面板 */ .el-picker-panel__content.el-date-range-picker__content.is-right .el-date-table, .…

拼多多商品信息一鍵抓取:深度解析商品詳情接口,Python實戰代碼來襲!

拼多多的商品詳情接口允許開發者通過指定的商品ID獲取商品的詳細信息&#xff0c;如商品標題、價格、描述、圖片等。接口采用HTTP請求方式&#xff0c;支持GET方法&#xff0c;返回格式為JSON。 三、接口調用 要調用拼多多的商品詳情接口&#xff0c;你需要遵循以下步驟&…

深度學習-01-作為“箱子“的變量

深度學習-01-作為"箱子"的變量 本文是《深度學習入門2-自製框架》 的學習筆記&#xff0c;記錄自己學習心得&#xff0c;以及對重點知識的理解。如果內容對你有幫助&#xff0c;請支持正版&#xff0c;去購買正版書籍&#xff0c;支持正版書籍不僅是尊重作者的辛勤勞…

6.12 Libbpf-bootstrap(三,APP)

一,APP 既然我們已經了解了最小應用以及Makefile中的編譯方式,接下來我們將通過bootstrap應用程序展示的一些額外的BPF特性。在現代BPF Linux環境中,bootstrap是我編寫可用于生產環境的BPF應用程序的方式。它依賴于BPF CO-RE(閱讀原因請點擊這里),并且需要Linux內核以CO…

Java基礎知識點(反射、注解、JDBC、TCP/UDP/URL)

文章目錄 反射反射的定義class對象反射的操作 注解注解的定義注解的應用注解的分類基準注解元注解 自定義注解自定義規則自定義demo JDBCTCP/UDP/URLTCPUDPURL 反射 反射的定義 Java Reflection是Java被視為動態語言的基礎啊&#xff0c; 反射機制允許程序在執行期間接入Refl…