zoukankan      html  css  js  c++  java
  • 十进制跟十六进制的字符串互转

    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
  • 相关阅读:
    基于libevent的TLS单向认证CS通信验证
    ubuntu按照时间顺序列出apt安装的程序
    网页识别语音插件annyang可以实现识别中文
    微信小程序图片和签名
    linux run/media/wang/centos_磁盘爆满
    一个页面实现增删改查
    查某关键字在数据库中的哪个位置
    ADO.NET五大对象
    怎样获取当前时间
    string与stringbuilder的区别
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/5060063.html
Copyright © 2011-2022 走看看