读书人

一个static_cast引发的char转int有关问

发布时间: 2012-08-16 12:02:15 作者: rapoo

一个static_cast引发的char转int问题
写了一段程序,放在某个群里,一同学说我这里用staic_cast有问题,不安全!

还请大家指点指点!

C/C++ code
// 读取出来大于'A'--17小于'a'的要重新计算值inline int CalcHigh_a( const char strHex ){    return static_cast<int>( strHex ) - CALCLETTER;}// 读取出来大于9小于'A'的要重新计算值inline int CalcHigh_A( const char strHex ){    return static_cast<int>( strHex ) - CALCHIGH;}



附上完整的代码:-------------我是觉得写得有点不太好看,需要怎么调整一下?

C/C++ code
#include "stdafx.h"#include "iostream"using namespace std;#define TRANSPOSEDIGIT         4// assist function#define DECIMALLENGTH0     1#define DECIMALLENGTH1     2#define DECIMALLENGTH2     3#define DECIMALLENGTH3     4#define CONVERT                    48#define CALCHIGH                ( 48 + 7 )#define CALCLETTER                ( 48 + 7 + 32 )#define LIMITNINE                16#define LIMITA                        31// 读取出来大于'A'--17小于'a'的要重新计算值inline int CalcHigh_a( const char strHex ){    return static_cast<int>( strHex ) - CALCLETTER;}// 读取出来大于9小于'A'的要重新计算值inline int CalcHigh_A( const char strHex ){    return static_cast<int>( strHex ) - CALCHIGH;}// 计算十六进制字符串的值int CalcStrDecimal( const char* strHex, const int nHexLength ){    int iResult = 0;    int ii = 0;    if ( DECIMALLENGTH0 == nHexLength )    {        ii = static_cast<int>( strHex[ 0 ] ) - CONVERT;        if ( ii > LIMITNINE && ii < LIMITA )        {            ii = CalcHigh_A( strHex[ 0 ] );        }        else if ( ii > LIMITA )        {            ii = CalcHigh_a( strHex[ 0 ] );        }        iResult += ii;    }    else if ( DECIMALLENGTH1 == nHexLength )    {        for ( int i = 0; i < nHexLength; i++ )        {            ii = static_cast<int>( strHex[ i ] ) - CONVERT;            if ( ii > LIMITNINE && ii < LIMITA )            {                ii = CalcHigh_A( strHex[ 0 ] );            }            else if ( ii > LIMITA )            {                ii = CalcHigh_a( strHex[ 0 ] );            }            switch( i )            {            case 0:                ii = ii << TRANSPOSEDIGIT;                break;            default:                break;            }            iResult += ii;        }    }    else if ( DECIMALLENGTH2 == nHexLength )    {        for ( int i = 0; i < nHexLength; i++ )        {            ii = static_cast<int>( strHex[ i ] ) - CONVERT;            if ( ii > LIMITNINE && ii < LIMITA )            {                ii = CalcHigh_A( strHex[ 0 ] );            }            else if ( ii > LIMITA )            {                ii = CalcHigh_a( strHex[ 0 ] );            }            switch( i )            {            case 0:                ii = ii << TRANSPOSEDIGIT << TRANSPOSEDIGIT;                break;            case 1:                ii = ii << TRANSPOSEDIGIT;                break;            default:                break;            }            iResult += ii;        }    }    else if ( DECIMALLENGTH3 == nHexLength )    {        for ( int i = 0; i < nHexLength; i++ )        {            ii = static_cast<int>( strHex[ i ] ) - CONVERT;            if ( ii > LIMITNINE && ii < LIMITA )            {                ii = CalcHigh_A( strHex[ 0 ] );            }            else if ( ii > LIMITA )            {                ii = CalcHigh_a( strHex[ 0 ] );            }            switch( i )            {            case 0:                ii = ii << TRANSPOSEDIGIT << TRANSPOSEDIGIT<< TRANSPOSEDIGIT;                break;            case 1:                ii = ii << TRANSPOSEDIGIT << TRANSPOSEDIGIT;                break;            case 2:                ii = ii << TRANSPOSEDIGIT;                break;            default:                break;            }            iResult += ii;        }    }    return iResult;}int _tmain(int argc, _TCHAR* argv[]){    // length == 3//    char strTest[ 5 ] = "A202";//    char strTest[ 5 ] = "a202";//    char strTest[ 5 ] = "B202";//    char strTest[ 5 ] = "b202";//    char strTest[ 5 ] = "c202";//    char strTest[ 5 ] = "C202";//    char strTest[ 5 ] = "d202";//    char strTest[ 5 ] = "D242";//    char strTest[ 5 ] = "0202";//    int lValue = CalcStrDecimal( strTest, 4 );//    char strTest[ 5 ] = "002";    char strTest[ 5 ] = "A22";//    char strTest[ 5 ] = "AAA";    int lValue = CalcStrDecimal( strTest, 3 );//    char strTest[ 5 ] = "02";//    char strTest[ 5 ] = "a2";//    char strTest[ 5 ] = "AA";//    int lValue = CalcStrDecimal( strTest, 2 );    //    char strTest[ 5 ] = "A";//    char strTest[ 5 ] = "a";//    int lValue = CalcStrDecimal( strTest, 1 );    cout << lValue << endl;    return 0;}// hex202 == int514 




[解决办法]
呃,没看出来有啥问题
[解决办法]
没看出来static_cast成int有啥问题。
char表示的整数值范围是int的真子集。
倒是这里干嘛这么麻烦,还依赖基本字符集中某些元素的连续性……直接用<cchar>里的一些函数不行么?
[解决办法]
完全没有问题,直接赋值都行的。int完全能兼容char
[解决办法]
strtol
[解决办法]
你自己很享受造轮子的过程,加油吧
[解决办法]
探讨

引用:
strtol


现在用的好像不是string。

[解决办法]
探讨

引用:
没看出来static_cast成int有啥问题。
char表示的整数值范围是int的真子集。
倒是这里干嘛这么麻烦,还依赖基本字符集中某些元素的连续性……直接用<cchar>里的一些函数不行么?


这个怎么说?cchar>里的一些函数?

[解决办法]
参考:
区别:static _cast、dynamic _cast、reinterpret_cast和const_cast
[解决办法]
看不出来什么问题

读书人网 >C++

热点推荐