一个static_cast引发的char转int问题
写了一段程序,放在某个群里,一同学说我这里用staic_cast有问题,不安全!
还请大家指点指点!
// 读取出来大于'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;}
#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