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

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;
}

以上是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;
}

上面代码是将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;
    }
}

时间: 2024-10-10 03:24:03

十进制跟十六进制的字符串互转的相关文章

二进制、十进制、十六进制、字符串之间的相互转换

1. 字节转10进制 直接使用(int)类型转换. /* * 字节转10进制 */ public static int byte2Int(byte b){ int r = (int) b; return r; } 2. 10进制转字节 直接使用(byte)类型转换. /* * 10进制转字节 */ public static byte int2Byte(int i){ byte r = (byte) i; return r; } 3. 字节数组转16进制字符串 对每一个字节,先和0xFF做与运算

C语言中字符串如何转换为二进制、八进制、十进制、十六进制

在C语言某个程序当中需要把文本16进制转换成对应的16进制数,比如字符串"0x1a"转换成10进制的26,可以用以下函数来实现 相关函数: atof, atoi, atol, strtod, strtoul表头文件: #include <stdlib.h>定义函数: long int strtol(const char *nptr, char **endptr, int base):函数的解释说明 这个函数会将参数nptr字符串根据参数base来转换成长整型数.参数base

C# 十进制与十六进制互转

1.从十六进制转换为十进制 /// <summary> /// 十六进制转换到十进制 /// </summary> /// <param name="hex"></param> /// <returns></returns> public static string Hex2Ten(string hex) { int ten = 0; for (int i = 0, j = hex.Length - 1; i &l

十进制转二、八、十六进制的字符串

这是我自己写的代码,有问题希望指出. 十进制转二进制 1 class DecToBin 2 { 3 public static void main(String[] args) 4 { 5 //System.out.println("Hello World!"); 6 long dec = -9223372036854775807l; 7 // -9223372036854775808 这个数不行,不要试,嘿嘿 8 String binStr=""; 9 long

C语言将字符串转换成对应的数字(十进制、十六进制)【转】

转自:http://wawlian.iteye.com/blog/1315133 问题1:讲一个十进制数字的字符串表示转换成对应的整数.举例:将“1234”转换成整数1234. C代码 收藏代码 /*将字符串s转换成相应的整数*/ int atoi(char s[]) { int i; int n = 0; for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i) { n = 10 * n + (s[i] - '0'); } return n;

python中各种基础类型的转换,二进制,八进制,十进制,十六进制

python中所有类型都是作为对象的形式来存在的. 在python中没有char型,只有字符串类型,这样我们可能将char型转换为整型时极不方便,但是python已经提供了这些转换的内置函数. python 中除了整型,其他进制的只能用字符串来表示 1 int() 可以将 二进制,八进制,十六进制转换成十进制整型 >>> int('1111', 2) 15 >>> int('f', 16) 15 >>> int('17', 8) 15 2 chr()

Java中二进制、十进制、十六进制及ASCII码与String及字节数组与十六进制之间的转换

public class DigitalTrans { /** * 数字字符串转ASCII码字符串 * * @param String * 字符串 * @return ASCII字符串 */ public static String StringToAsciiString(String content) { String result = ""; int max = content.length(); for (int i = 0; i < max; i++) { char c

判断是否十六进制格式字符串

/// 判断是否十六进制格式字符串             public bool IsHexadecimal(string str)        {            const string PATTERN = @"[A-Fa-f0-9]+$";            return System.Text.RegularExpressions.Regex.IsMatch(str, PATTERN);        } /// 判断是否八进制格式字符串            

Swift - 将String类型的数字转换成数字类型(支持十进制、十六进制)

1,十进制的字符串转成数字 Swift中,如果要把字符串转换成数字类型(比如整型,浮点型等).可以先转成NSString类型,让后再转. 1 2 3 4 //将文本框中的值转换成数字 var i = (tf1.text as NSString).intValue var f = (tf1.text as NSString).floatValue var d = (tf1.text as NSString).doubleValue 2,十六进制的字符串转成数字 (1)定义一个转换方法 1 2 3