• 十进制跟十六进制的字符串互转


    void StrDec2BufDec(const StrVal& strDec, BYTE* bufDec) {
        for (size_t i = 0; i < strDec.length(); ++i) {
            bufDec[i] = 0;
            if (strDec[i] >= L'0' && strDec[i] <= L'9')
                bufDec[i] = strDec[i] - L'0';
        }
    }
    
    int StrDec2HexBuf( const StrVal& strDec, BYTE* destBuf ) {
        size_t nIndex = 0;
        while (nIndex < strDec.length() && (strDec[nIndex] <= '0' || strDec[nIndex] > '9'))
            ++nIndex;
        if (nIndex >= strDec.length())
            return 0;
    
        size_t nDecLen = strDec.length() - nIndex;
        BYTE* decBuf = new BYTE[nDecLen+1];
        memset(decBuf, 0, nDecLen+1);
        StrDec2BufDec(StrVal(strDec, nIndex), decBuf);
    
        BYTE* hexBuf = new BYTE[nDecLen];
        memset(hexBuf, 0, nDecLen);
        BYTE nTemp = 0;
        for (size_t nDecIndex = 0; nDecIndex < nDecLen; ++nDecIndex) {
            nTemp = 0;
            for (int nBitIndex = 0; nBitIndex < 8; ++nBitIndex) {
                for (size_t nStartIndex = nDecIndex; nStartIndex < nDecLen; ++nStartIndex) {
                    decBuf[nStartIndex+1] += (decBuf[nStartIndex]&0x01) == 1?10:0;
                    decBuf[nStartIndex] >>= 1;
                }
                nTemp |= decBuf[nDecLen] > 0? (1 << nBitIndex):0;
                decBuf[nDecLen] = 0;
            }
            hexBuf[nDecIndex] = nTemp;
        }
    
        while (nDecLen > 0) {
            if (hexBuf[--nDecLen] > 0)
                break;
        }
    
        if (destBuf != NULL)
            memcpy(destBuf, hexBuf, nDecLen+1);
    
        delete [] decBuf;
        delete [] hexBuf;
    
        return nDecLen + 1;
    }
    View Code

    以上是10进制转16进制的代码,可以调用int StrDec2HexBuf( const StrVal& strDec, BYTE* destBuf ),将strDec的十进制数据转换成16进制的destBuf字符串,并返回destBuf的有效长度

    关于10进制转16进制的方法:

    1、我这里先将strDec转换成以每个字节代表一个数字的方法表示的方式。然后再进行相应的转换。void StrDec2BufDec(const StrVal& strDec, BYTE* bufDec)

    2、关于十进制转16进制,我是将十进制转换成2进制的方式。即对每个数字进行除2取余的方式。具体关于十进制转16进制方法很多,我用转换成2进制只是其中一种方法。

    #include <string>
    typedef std::wstring StrVal;

    int CalcStep(byte* cur, int nCurLen) {
        int nTemp = 0;
        for (int nIndex = 0; nIndex < nCurLen; ++nIndex) {
            nTemp += cur[nIndex] * 256;
            cur[nIndex] = nTemp % 10;
            nTemp /= 10;
        }
    
        while (nTemp > 0) {
            cur[nCurLen++] = nTemp % 10;
            nTemp /= 10;
        }
    
        return nCurLen;
    }
    
    void MulOneByte(byte* dec, int data, byte* base, int nBaseLen) {
        for (int nBaseIndex = 0; nBaseIndex < nBaseLen; ++nBaseIndex) {
            int nTemp = data * base[nBaseIndex];
            for (int nDecIndex = nBaseIndex; nTemp > 0; ++nDecIndex) {
                nTemp += dec[nDecIndex];
                dec[nDecIndex] = nTemp % 10;
                nTemp /= 10;
            }
        }
    }
    
    void Hex2Dec(byte* hexBuf, int nHexLen, byte* decBuf) {
        byte* base = new byte[nHexLen*4];
        memset(base, 0, nHexLen*4);
        base[0] = 1;
        int nCurBaseLen = 1;
    
        for (int nHexIndex = 0; nHexIndex < nHexLen; ++nHexIndex) {
            MulOneByte (decBuf, hexBuf[nHexIndex], base, nCurBaseLen);
            nCurBaseLen = CalcStep(base, nCurBaseLen);
        }
    }
    
    //////////////////////////////////////////////////////////////////////////
    StrVal Convert2DecData(BYTE* srcData, int nLen) {
        StrVal destStr;
    
        int nDecLen = nLen*4;
        BYTE* decData = new BYTE[nDecLen];
        memset(decData, 0, nDecLen);
        Hex2Dec(srcData, nLen, decData);
    
        while (nDecLen-- > 0) {
            if (decData[nDecLen] > 0)
                break;
        }
        wchar_t midBuf[MAX_PATH];
        while (nDecLen >= 0) {
            swprintf_s(midBuf, MAX_PATH, L"%d", decData[nDecLen--]);
            destStr.append(midBuf);
        }
    
        delete [] decData;
    
        return destStr;
    }
    View Code

    上面代码是将16进制转成10进制的字符串

    在void Hex2Dec(byte* hexBuf, int nHexLen, byte* decBuf)这里,我也是将结果以decBuf的每个字节代表一个0~9的数字,这里我new了一个比十六进制缓冲区大4倍的缓冲区来存放数据。(经计算3倍应该够了)

    首先调用void MulOneByte(byte* dec, int data, byte* base, int nBaseLen)

    我的base[]初始值为1,然后再乘以hexBuf的每个字节。计算结果再加到dec[]

    CalcStep则是为base缓冲区的值(以10进制表示)乘以256

    因为Hex2Dec中,hexBuf每次以一个字节的进制从低位到高位进行计算,所以每次计算完成之后需要将base乘以256,然后将base调整成每个字节以10进制表示的形式。

    最终

    StrVal Convert2DecData(BYTE* srcData, int nLen)函数的显示。因为我的电脑是小端模式,所以从后往前进行打印输出。

    额外添加自增的函数。具体自增方式可以再修改

    void IncData( BYTE* val, INT64 nIncStep ) {
        BYTE* pIncStep = (BYTE*)&nIncStep;
    
        int nLeft = 0;
        for (int nIndex = 0; nIndex < sizeof(INT64); ++nIndex) {
            for (int nInner = 0; nInner < 8; ++nInner) {
                nLeft = nLeft + (val[nIndex] & (1<<nInner)) + (pIncStep[nIndex] & (1<<nInner));
                val[nIndex] &= ~(1 << nInner);
                val[nIndex] ^= (nLeft & (1<<nInner));
                nLeft &= 1 << (nInner+1);
            }
            nLeft >>= 8;
        }
    
        for (int nIndex = sizeof(INT64); nLeft > 0; ++nIndex) {
            for (int nInner = 0; nInner < 8 && nLeft > 0; ++nInner) {
                nLeft = nLeft + (val[nIndex] & (1 << nInner));
                val[nIndex] &= nLeft & (1 << nInner) & 0xff;
                nLeft &= 1 << (nInner+1);
            }
            nLeft >>= 8;
        }
    }
    View Code
  • 相关阅读:
    [LeetCode]String主题系列{第5,6题}
    [LeetCode]Math主题系列{第7,9,13,273题}
    [LeetCode]LinkedList主题系列{第2题}
    [LeetCode]HashTable主题系列{第3,36,49,94,136,138,187,202,204,205,290,347,389,409,438,451,463,500,508,560,594,599题}
    由于博客园的道路越来越像CSDN了,已经不再是当年的博客园了,决定退出博客园,后续建立自己的博客站点。
    Revit二次开发——非模态窗口的事件处理
    Revit二开---Schemachema扩展数据
    Revit二开---ViewFamily视图类型枚举
    CAD二开---扩展数据XData
    CAD二开---框选文字批量对齐
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/5060063.html
Copyright © 2020-2023  润新知