Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5404617
  • 博文数量: 763
  • 博客积分: 12108
  • 博客等级: 上将
  • 技术积分: 15717
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-28 21:21
个人简介

业精于勤,荒于嬉

文章分类

全部博文(763)

文章存档

2018年(6)

2017年(15)

2016年(2)

2015年(31)

2014年(14)

2013年(87)

2012年(75)

2011年(94)

2010年(190)

2009年(38)

2008年(183)

2007年(28)

分类: C/C++

2009-12-05 19:12:57

/*
*    函数原形    char * BinaryToOcatl(char* _pchDest, const char* _pchSrc);
*    表头文件    #include
*                        #include
*                        #include
*    函数描述    二进制转八进制。将二进制字符串转换为八进制字符串,_pchSrc 串中不能有 '+'、'-' 和 '.'
*        参 数    _pchSrc,要转换的二进制串,只能是由'0' 和'1' 组成的字符串。
*                        _pchDest,存放转换后的八进制串。要有足够的空间来容纳处理后的字符串
*     返回值    成功,返回转换后 _pchDest 目标串的首地址
*                        失败,返回NULL
*        作 者    武立强
*        时    间    2009-02-17
*        备 注    目前还不支持小数
*/

char * BinaryToOcatl(char* _pchDest, const char* _pchSrc)
{
    assert( NULL != _pchDest && NULL != _pchSrc );

    char* pchDestFirst = _pchDest;
    char* pNewSrc = NULL;
    char* pNewSrcFirst = NULL;
    char szTemp[4] = "";
    int nDestLenth = 0;
    int nSrcLenth = 0;
    bool bStart = false; // 表示第一个非 '0' 字符的开始


    nSrcLenth = strlen(_pchSrc);

    // 将_pchSrc 中开头的 '0' 和所有的空格全部过滤掉, 放在一个新串中

    pNewSrc = (char*)malloc(sizeof(char) * (nSrcLenth + 1));
    pNewSrcFirst = pNewSrc;
    memset(pNewSrc, 0, (nSrcLenth + 1));

    while( '\0' != *_pchSrc )
    {
        // 过滤空格

        if( ' ' == *_pchSrc )
        {
            _pchSrc++;
            continue;        
        }

        // 判断第一个 非 '0' 字符

        if( !bStart && '0' != *_pchSrc )
        {
            bStart = true;
            continue;
        }

        // 字符串中的字符只能是 '1', '0'

        if( bStart && ('1' == *_pchSrc || '0' == *_pchSrc) )
        {
            *pNewSrc = *_pchSrc;
            pNewSrc++;
        }
        else if ( bStart && !('1' == *_pchSrc || '0' == *_pchSrc) )
        {
            // _pchSrc 串中有特殊字符,错误!

            return NULL;
        }
        _pchSrc++;
    }     
    _pchSrc = NULL;
    
    // 将 pNewSrc 指针指到字符串的末尾

    pNewSrc =pNewSrcFirst + ( strlen(pNewSrcFirst) - 1 );

    while( pNewSrc >= pNewSrcFirst )
    {
        memset(szTemp, 0, 4);
        for( int i=2; i>=0; i-- )
        {
            if( pNewSrc < pNewSrcFirst )
            {
                szTemp[i] = '0';
            }
            else
            {
                szTemp[i] = *pNewSrc;
                pNewSrc--;
            }    
        }

        // 对比转换

        if( !strcmp(szTemp, "000") )
        {
            *_pchDest = '0';
        }
        else if( !strcmp(szTemp, "001") )
        {
            *_pchDest = '1';
        }
        else if( !strcmp(szTemp, "010") )
        {
            *_pchDest = '2';
        }
        else if( !strcmp(szTemp, "011") )
        {
            *_pchDest = '3';
        }
        else if( !strcmp(szTemp, "100") )
        {
            *_pchDest = '4';
        }
        else if( !strcmp(szTemp, "101") )
        {
            *_pchDest = '5';
        }
        else if( !strcmp(szTemp, "110") )
        {
            *_pchDest = '6';
        }
        else if( !strcmp(szTemp, "111") )
        {
            *_pchDest = '7';
        }
        else
        {
            // 错误

            return NULL;
        }
        _pchDest++;    
    }
    *_pchDest = '\0';

    // 释放内存

    free(pNewSrcFirst);
    pNewSrcFirst = NULL;
    pNewSrc = NULL;
    
    nDestLenth = strlen(pchDestFirst);

    // 将 _pchDest 串反转

    for( int i=0; i< (nDestLenth/2); i++ )
    {
        char chTemp = 0;
        chTemp = pchDestFirst[i];
        pchDestFirst[i] = pchDestFirst[nDestLenth - 1 - i];
        pchDestFirst[nDestLenth - 1 - i] = chTemp;
    }

    return pchDestFirst;
}

/*
*    函数原形    char * BinaryToHex(char* _pchDest, const char* _pchSrc);
*    表头文件    #include
*                        #include
*                        #include
*    函数描述    二进制转十六进制。将二进制字符串转换为十六进制字符串,_pchSrc 串中不能有 '+'、'-' 和 '.'
*        参 数    _pchSrc,要转换的二进制串,只能是由'0' 和'1' 组成的字符串。
*                        _pchDest,存放转换后的十六进制串。要有足够的空间来容纳处理后的字符串
*     返回值    成功,返回转换后 _pchDest 目标串的首地址
*                        失败,返回NULL
*        作 者    武立强
*        时    间    2009-02-17
*        备 注    目前还不支持小数
*/

char * BinaryToHex(char* _pchDest, const char* _pchSrc)
{
    assert( NULL != _pchDest && NULL != _pchSrc );

    char* pchDestFirst = _pchDest;
    char* pNewSrc = NULL;
    char* pNewSrcFirst = NULL;
    char szTemp[5] = "";
    int nDestLenth = 0;
    int nSrcLenth = 0;
    bool bStart = false; // 表示第一个非 '0' 字符的开始


    nSrcLenth = strlen(_pchSrc);

    // 将_pchSrc 中开头的 '0' 和所有的空格全部过滤掉, 放在一个新串中

    pNewSrc = (char*)malloc(sizeof(char) * (nSrcLenth + 1));
    pNewSrcFirst = pNewSrc;
    memset(pNewSrc, 0, (nSrcLenth + 1));

    while( '\0' != *_pchSrc )
    {
        // 过滤空格

        if( ' ' == *_pchSrc )
        {
            _pchSrc++;
            continue;        
        }

        // 判断第一个 非 '0' 字符

        if( !bStart && '0' != *_pchSrc )
        {
            bStart = true;
            continue;
        }

        // 字符串中的字符只能是 '1', '0'

        if( bStart && ('1' == *_pchSrc || '0' == *_pchSrc) )
        {
            *pNewSrc = *_pchSrc;
            pNewSrc++;

        }
        else if ( bStart && !('1' == *_pchSrc || '0' == *_pchSrc) )
        {
            // _pchSrc 串中有特殊字符,错误!

            return NULL;
        }
        _pchSrc++;
    }     
    _pchSrc = NULL;
    
    // 将 pNewSrc 指针指到字符串的末尾

    pNewSrc =pNewSrcFirst + ( strlen(pNewSrcFirst) - 1 );

    while( pNewSrc >= pNewSrcFirst )
    {
        memset(szTemp, 0, sizeof(szTemp));
        for( int i=3; i>=0; i-- )
        {
            if( pNewSrc < pNewSrcFirst )
            {
                szTemp[i] = '0';
            }
            else
            {
                szTemp[i] = *pNewSrc;
                pNewSrc--;
            }    
        }

        // 对比转换

        if( !strcmp(szTemp, "0000") )
        {
            *_pchDest = '0';
        }
        else if( !strcmp(szTemp, "0001") )
        {
            *_pchDest = '1';
        }
        else if( !strcmp(szTemp, "0010") )
        {
            *_pchDest = '2';
        }
        else if( !strcmp(szTemp, "0011") )
        {
            *_pchDest = '3';
        }
        else if( !strcmp(szTemp, "0100") )
        {
            *_pchDest = '4';
        }
        else if( !strcmp(szTemp, "0101") )
        {
            *_pchDest = '5';
        }
        else if( !strcmp(szTemp, "0110") )
        {
            *_pchDest = '6';
        }
        else if( !strcmp(szTemp, "0111") )
        {
            *_pchDest = '7';
        }
        else if( !strcmp(szTemp, "1000") )
        {
            *_pchDest = '8';
        }
        else if( !strcmp(szTemp, "1001") )
        {
            *_pchDest = '9';
        }
        else if( !strcmp(szTemp, "1010") )
        {
            *_pchDest = 'A';
        }
        else if( !strcmp(szTemp, "1011") )
        {
            *_pchDest = 'B';
        }
        else if( !strcmp(szTemp, "1100") )
        {
            *_pchDest = 'C';
        }
        else if( !strcmp(szTemp, "1101") )
        {
            *_pchDest = 'D';
        }
        else if( !strcmp(szTemp, "1110") )
        {
            *_pchDest = 'E';
        }
        else if( !strcmp(szTemp, "1111") )
        {
            *_pchDest = 'F';
        }
        else
        {
            // 错误

            return NULL;
        }
        _pchDest++;    
    }
    *_pchDest = '\0';

    // 释放内存

    free(pNewSrcFirst);
    pNewSrcFirst = NULL;
    pNewSrc = NULL;
    
    nDestLenth = strlen(pchDestFirst);

    // 将 _pchDest 串反转

    for( int i=0; i< (nDestLenth/2); i++ )
    {
        char chTemp = 0;
        chTemp = pchDestFirst[i];
        pchDestFirst[i] = pchDestFirst[nDestLenth - 1 - i];
        pchDestFirst[nDestLenth - 1 - i] = chTemp;
    }

    return pchDestFirst;
}

/*
*    函数原形    char * OcatlToBinary(char* _pchDest, const char* _pchSrc);
*    表头文件    #include
*                        #include
*                        #include
*    函数描述    八进制转二进制。将八进制字符串转换为二进制字符串,_pchSrc 串中不能有 '+'、'-' 和 '.'
*        参 数    _pchSrc,要转换的八进制串,只能是由'0' 到'7'之间的字符组成的字符串。
*                        _pchDest,存放转换后的二进制串。要有足够的空间来容纳处理后的字符串
*     返回值    成功,返回转换后 _pchDest 目标串的首地址
*                        失败,返回NULL
*        作 者    武立强
*        时    间    2009-02-17
*        备 注    目前还不支持小数
*/

char * OcatlToBinary(char* _pchDest, const char* _pchSrc)
{
    assert( NULL != _pchDest && NULL != _pchSrc );
    
    char* pchDestFirst = _pchDest;
    char* pNewSrc = NULL;
    char* pNewSrcFirst = NULL;
    int nSrcLenth = 0;
    bool bStart = false; // 表示第一个非 '0' 字符的开始

    int nZeroCount = 0; // 表示前边 '0' 的个数


    nSrcLenth = strlen(_pchSrc);
    pNewSrc = (char*)malloc(sizeof(char) * (nSrcLenth + 1));
    pNewSrcFirst = pNewSrc;
    memset(pNewSrc, 0, (nSrcLenth + 1));

    // 将_pchSrc 中开头的 '0' 和所有的空格全部过滤掉, 放在一个新串pNewSrc中

    while( '\0' != *_pchSrc )
    {
        // 过滤空格

        if( ' ' == *_pchSrc )
        {
            _pchSrc++;
            continue;        
        }

        // 判断第一个 非 '0' 字符

        if( !bStart && '0' != *_pchSrc )
        {
            bStart = true;
            continue;
        }

        // 字符串中的字符只能是 '0' 到 '7' 之间的字符

        if( bStart && ('0' <= *_pchSrc && '7' >= *_pchSrc) )
        {
            *pNewSrc = *_pchSrc;
            pNewSrc++;
        
        }
        else if ( bStart && !('0' <= *_pchSrc && '7' >= *_pchSrc) )
        {
            // _pchSrc 串中有特殊字符,错误!

            return NULL;
        }
        _pchSrc++;
    }
    _pchSrc = NULL;
    pNewSrc = pNewSrcFirst;

    // 逻辑转换

    while( '\0' != *pNewSrc )
    {
        if( '0' == *pNewSrc )
        {
            strcat(_pchDest, "000");            
        }
        else if( '1' == *pNewSrc )
        {
            strcat(_pchDest, "001");
        }
        else if( '2' == *pNewSrc )
        {
            strcat(_pchDest, "010");
        }
        else if( '3' == *pNewSrc )
        {
            strcat(_pchDest, "011");
        }
        else if( '4' == *pNewSrc )
        {
            strcat(_pchDest, "100");
        }
        else if( '5' == *pNewSrc )
        {
            strcat(_pchDest, "101");
        }
        else if( '6' == *pNewSrc )
        {
            strcat(_pchDest, "110");
        }
        else if( '7' == *pNewSrc )
        {
            strcat(_pchDest, "111");
        }
        else
        {
            // 错误

            return NULL;
        }
        _pchDest += 3;
        pNewSrc++;
    }

    // 释放内存

    free(pNewSrcFirst);
    pNewSrcFirst = NULL;
    pNewSrc = NULL;
    
    nZeroCount = 0; //使用前清零

    bStart = false;
    _pchDest = pchDestFirst;

    // 将 _pchDest 最前边开始的 '0' 过滤掉

    while( '\0' != *_pchDest )
    {
        // 找到第一个非 '0' 字符

        if( !bStart && '0' != *_pchDest )
        {
            nZeroCount = (_pchDest - pchDestFirst); // 得到前边0的个数

            bStart = true;
        }

        if( bStart )
        {
            *(_pchDest - nZeroCount) = *_pchDest; // 向前移动

        }
        _pchDest++;
    }
    *(_pchDest - nZeroCount) = '\0'; //别忘了 '\0'


    return pchDestFirst;
}

/*
*    函数原形    char * HexToBinary(char* _pchDest, const char* _pchSrc);
*    表头文件    #include
*                        #include
*                        #include
*    函数描述    十六进制转二进制。将十六进制字符串转换为二进制字符串,_pchSrc 串中不能有 '+'、'-' 和 '.'
*        参 数    _pchSrc,要转换的十六进制串,只能是由'0' 到'7'和 'A'到 'F'之间的字符组成的字符串。
*                        _pchDest,存放转换后的二进制串。要有足够的空间来容纳处理后的字符串
*     返回值    成功,返回转换后 _pchDest 目标串的首地址
*                        失败,返回NULL
*        作 者    武立强
*        时    间    2009-02-17
*        备 注    目前还不支持小数
*/

char * HexToBinary(char* _pchDest, const char* _pchSrc)
{
    assert( NULL != _pchDest && NULL != _pchSrc );
    
    char* pchDestFirst = _pchDest;
    char* pNewSrc = NULL;
    char* pNewSrcFirst = NULL;
    int nSrcLenth = 0;
    bool bStart = false; // 表示第一个非 '0' 字符的开始

    int nZeroCount = 0; // 表示前边 '0' 的个数


    nSrcLenth = strlen(_pchSrc);
    pNewSrc = (char*)malloc(sizeof(char) * (nSrcLenth + 1));
    pNewSrcFirst = pNewSrc;
    memset(pNewSrc, 0, (nSrcLenth + 1));

    // 将_pchSrc 中开头的 '0' 和所有的空格全部过滤掉, 放在一个新串pNewSrc中

    while( '\0' != *_pchSrc )
    {
        // 过滤空格

        if( ' ' == *_pchSrc )
        {
            _pchSrc++;
            continue;        
        }

        // 判断第一个 非 '0' 字符

        if( !bStart && '0' != *_pchSrc )
        {
            bStart = true;
            continue;
        }

        // 字符串中的字符只能是 '0' 到 '9' 和 'A'到 'F' 之间的字符

        if( bStart && (('0' <= *_pchSrc && '7' >= *_pchSrc) || ('A' <= *_pchSrc && 'F' >= *_pchSrc)) )
        {
            *pNewSrc = *_pchSrc;
            pNewSrc++;
        
        }
        else if ( bStart && !(('0' <= *_pchSrc && '7' >= *_pchSrc) || ('A' <= *_pchSrc && 'F' >= *_pchSrc)) )
        {
            // _pchSrc 串中有特殊字符,错误!

            return NULL;
        }
        _pchSrc++;
    }
    _pchSrc = NULL;
    pNewSrc = pNewSrcFirst;

    // 逻辑转换

    while( '\0' != *pNewSrc )
    {
        if( '0' == *pNewSrc )
        {
            strcat(_pchDest, "0000");            
        }
        else if( '1' == *pNewSrc )
        {
            strcat(_pchDest, "0001");
        }
        else if( '2' == *pNewSrc )
        {
            strcat(_pchDest, "0010");
        }
        else if( '3' == *pNewSrc )
        {
            strcat(_pchDest, "0011");
        }
        else if( '4' == *pNewSrc )
        {
            strcat(_pchDest, "0100");
        }
        else if( '5' == *pNewSrc )
        {
            strcat(_pchDest, "0101");
        }
        else if( '6' == *pNewSrc )
        {
            strcat(_pchDest, "0110");
        }
        else if( '7' == *pNewSrc )
        {
            strcat(_pchDest, "0111");
        }
        else if( '8' == *pNewSrc )
        {
            strcat(_pchDest, "1000");
        }
        else if( '9' == *pNewSrc )
        {
            strcat(_pchDest, "1001");
        }
        else if( 'A' == *pNewSrc )
        {
            strcat(_pchDest, "1010");
        }
        else if( 'B' == *pNewSrc )
        {
            strcat(_pchDest, "1011");
        }
        else if( 'C' == *pNewSrc )
        {
            strcat(_pchDest, "1100");
        }
        else if( 'D' == *pNewSrc )
        {
            strcat(_pchDest, "1101");
        }
        else if( 'E' == *pNewSrc )
        {
            strcat(_pchDest, "1110");
        }
        else if( 'F' == *pNewSrc )
        {
            strcat(_pchDest, "1111");
        }
        else
        {
            // 错误

            return NULL;
        }
        _pchDest += 4;
        pNewSrc++;
    }

    // 释放内存

    free(pNewSrcFirst);
    pNewSrcFirst = NULL;
    pNewSrc = NULL;
    
    nZeroCount = 0; //使用前清零

    bStart = false;
    _pchDest = pchDestFirst;

    // 将 _pchDest 最前边开始的 '0' 过滤掉

    while( '\0' != *_pchDest )
    {
        // 找到第一个非 '0' 字符

        if( !bStart && '0' != *_pchDest )
        {
            nZeroCount = (_pchDest - pchDestFirst); // 得到前边0的个数

            bStart = true;
        }

        if( bStart )
        {
            *(_pchDest - nZeroCount) = *_pchDest; // 向前移动

        }
        _pchDest++;
    }
    *(_pchDest - nZeroCount) = '\0'; //别忘了 '\0'


    return pchDestFirst;
}

/*
*    函数原形    int BinaryStringToInt(const char* _pStr);
*    表头文件    #include
*    函数描述    二进制字符串转换为整形数字。_pStr 串中不能有 '+'、'-' 和 '.'
*        参 数    _pStr,要转换的二进制串,只能是由'0'和 '1'字符组成的字符串。
*     返回值    成功,返回转换后的整数
*                        失败,返回-1
*        作 者    武立强
*        时    间    2009-02-17
*        备 注    _pStr 字符串中的空格可以被过滤掉,_pStr中可以存在空格, 当您传入"" 或 " " 时,
*                        函数将返回 0
*/

int BinaryStringToInt(const char* _pStr)
{
    assert( NULL != _pStr );

    int nNumber = 0;

    while( '\0' != *_pStr )
    {
        if( ' ' == *_pStr )
        {
            // 过滤空格字符

        }
        else if( *_pStr < '0' || *_pStr > '1')
        {
            // 如果遇到非'0'--'1' 之间的字符,直接返回 -1

            return -1;
        }
        else
        {
            nNumber = nNumber*2 + (*_pStr -48);
        }
        _pStr++;
    }

    return nNumber;
}

/*
*    函数原形    char * IntToBinaryString(char* _pchBinStr, int nNumber);
*    表头文件    #include
*    函数描述    将整数转换为二进制字符串,只支持正数转换, 不支持负数和 0 的转换
*        参 数    nNumber,要转换的正整数
*                        _pchBinStr 存放转换后的二进制字符串。要有足够的空间来容纳转换后的字符串
*     返回值    成功,返回转换后的二进制字符串
*                        失败,返回NULL
*        作 者    武立强
*        时    间    2009-02-18
*        备 注    目前还不支持小数
*/

char * IntToBinaryString(char* _pchBinStr, int nNumber)
{
    assert( NULL != _pchBinStr );

    char * pchFirst = _pchBinStr;

    if( nNumber <= 0 )
    {
        return NULL;
    }

    while( nNumber > 0 )
    {
        *_pchBinStr = (nNumber % 2) + 48; // +48 是将数字转换为字符, '0'=48

        nNumber = nNumber / 2; // 两个整数相除,结果取整

        _pchBinStr++;
    }
    *_pchBinStr = '\0';
    
    int nLen = 0;
    nLen = _pchBinStr - pchFirst; //转换后字符串的长度


    // 将字符串反转(记住此算法)

    for(int i=0; i<(nLen/2); i++)
    {
        char chTemp = 0; // 每次都初始化为 0

        chTemp = pchFirst[i];
        pchFirst[i] = pchFirst[nLen - 1 - i];
        pchFirst[nLen - 1 - i] = chTemp;
    }

    return pchFirst;
}


brspan style=span style= char * IntToBinaryString(char* _pchBinStr, int nNumber);/span
阅读(1116) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~