64,654
社区成员
发帖
与我相关
我的任务
分享
// 读取出来大于'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