Convert hexadecimal string with leading “0x” to signed short in C++?

前端 未结 6 837
孤城傲影
孤城傲影 2020-12-04 00:37

I found the code to convert a hexadecimal string into a signed int using strtol, but I can\'t find something for a short int (2 bytes). Here\' my p

6条回答
  •  悲哀的现实
    2020-12-04 00:45

    // convert unsigned-integer to it's hexadecimal string represention
    // 0x12345678 -> '12345678'
    // N is BYTE/WORD/UINT/ULONGLONG
    // T is char or wchar_t
    template  inline T* UnsignedToHexStr(N    n             ,  // [i  ]
                                                           T*   pcStr         ,  // [i/o] filled with string
                                                           UINT nDigits       ,  // [i  ] number of digits in output string / 0 (auto)
                                                           bool bNullTerminate ) // [i  ] whether to add NULL termination
    {
        if ((N)-1 < (N)1)              // if type of N is floating-point / signed-integer
            if (::IsDebuggerPresent())
            {
                ::OutputDebugString(_T("UnsignedToHexStr: Incorrect type passed\n"));
                ::DebugBreak();
            }
    
        if (!nDigits)
            nDigits= GetUnsignedHexDigits(n);
    
        if (1 == sizeof(T))
        {
            const char _czIntHexConv[]= "0123456789ABCDEF";
            for (int i= nDigits-1; i>= 0; i--)
            {
                char* pLoc= (char*)&pcStr[i];
                *pLoc= _czIntHexConv[n & 0x0F];
                n >>= 4;
            }
        }
        else
        {
            const wchar_t _czIntHexConv[]= L"0123456789ABCDEF";
            for (int i= nDigits-1; i>= 0; i--)
            {
                wchar_t* pLoc= (wchar_t*)&pcStr[i];
                *pLoc= _czIntHexConv[n & 0x0F];
                n >>= 4;
            }
        }
    
        if (bNullTerminate)
            pcStr[nDigits]= 0;
    
        return pcStr;
    }
    
    
    
    // --------------------------------------------------------------------------
    // convert unsigned-integer in HEX string represention to it's numerical value
    // '1234' -> 0x1234
    // N is BYTE/WORD/UINT/ULONGLONG
    // T is char or wchar_t
    template  inline bool HexStrToUnsigned(const T* pczSrc                    ,
                                                             N&       n                         ,
                                                             bool     bSpecificTerminator= false,  // whether string should terminate with specific terminating char
                                                             T        cTerminator        = 0     ) // specific terminating char
    {
        n= 0;
    
        if (!pczSrc)
            return false;
    
        while ((32 == *pczSrc) || (9 == *pczSrc))
            pczSrc++;
    
        bool bLeadZeros= *pczSrc == _T('0');
        while (*pczSrc == _T('0')) // skip leading zeros
            pczSrc++;
    
        BYTE nMaxDigits= 2*sizeof(N);
        BYTE nDigits   = 0          ;
    
        while (true)
        {
            if ( (*pczSrc >= _T('0')) && (*pczSrc <= _T('9')))
            { if (nDigits==nMaxDigits) return false; n= (n<<4) + (*pczSrc-_T('0')   ); pczSrc++; nDigits++; continue; }
    
            if ( (*pczSrc >= _T('A')) && (*pczSrc <= _T('F')))
            { if (nDigits==nMaxDigits) return false; n= (n<<4) + (*pczSrc-_T('A')+10); pczSrc++; nDigits++; continue; }
    
            if ( (*pczSrc >= _T('a')) && (*pczSrc <= _T('f')))
            { if (nDigits==nMaxDigits) return false; n= (n<<4) + (*pczSrc-_T('a')+10); pczSrc++; nDigits++; continue; }
    
            if (bSpecificTerminator)
                if (*pczSrc != cTerminator)
                    return false;
    
            break;
        }
    
        return (nDigits>0) || bLeadZeros; // at least one digit
    }
    

提交回复
热议问题