16进制串转数值数组Hexstr2Array





#define UNICODE
#define _UNICODE

#include <stdio.h>
#include <windows.h>
#include <tchar.h>

bool IsHexChar(TCHAR c)
{
 if(  _T('a') <= c && c <= _T('f')  ||  
  _T('A') <= c && c <= _T('F')  || 
  _T('0') <= c && c <= _T('9') ) return true;
 else return false;
}

void PrintfArray(long *lArray,int len)
{
 
  for(int j=0;j<len;++j)
 {  
  _tprintf(L"[%02d]:%8X \t",j,lArray[j]);
  if(j%6==5) _tprintf(L"\n");
 }
}

int HexStr2Array( TCHAR   *lpszHexBuffer,  long  *lArray )
{
//第一次传lArray=NULL可取得字符串中包含十六进制数值个数
    TCHAR *pStart=0,*pEnd=0;  
   int TotalArrayItem=0; 
   pStart=lpszHexBuffer;
   int len=_tcslen(lpszHexBuffer);
    // printf("lpszHexBuffer=%p,%c\n",lpszHexBuffer,lpszHexBuffer[len-1]);
    while( *pStart!=TEXT('\0') && pStart<(lpszHexBuffer+len) )//while( *pStart!='\0' )pStart由_tcstol()返回时跳出,没有找到\0,所以出现开头箭头所指的BUG
 { 
   if( IsHexChar( *pStart ) )
   {
                long ret = _tcstol(pStart, &pEnd/*返回指向第一个不能转换的字符地址*/, 16/*字符串当作几进*/);  
  
                     if( lArray!=NULL )
                        {
                                lArray[ TotalArrayItem ]=ret; 
                                _tprintf(L"[%02d][%8X] %s\n",TotalArrayItem, ret ,pEnd );
                        }
                        TotalArrayItem++;  
                     pStart=pEnd;
  } 
      pStart++;
 }
        return TotalArrayItem;
}
int _tmain()
{ 

                TCHAR   *HexBuffer=L"^_^ieee-CCCC <*)>>>=< and --<-<-<@ 89a00b^-^I'll see what I can do.12 34 56 78 9a bc de f0^_^char0xface";
                //TCHAR   *HexBuffer=L"_1,2=3+4 5/6*7!8@9#0$a%b^c&d(e)f~";

                int len= HexStr2Array( HexBuffer, NULL ); //lArray=NULL可取得字符串中包含十六进制数值个数       
                long *lArray=new long [len];
                //long *lArray=(long*)malloc( len * sizeof( long ) );//sizeof( TCHAR )是错的

                _tprintf(L"HEX string:  %s\n----------------\n",HexBuffer);

                for(int j=0;j<len;++j)
                { 
                         lArray[j]=0xcccccccc; 
                }
                PrintfArray(lArray,len);
                _tprintf(L"\n----------------\n");
  
                HexStr2Array( HexBuffer, lArray );  
                _tprintf(L"\n----------------\n");
 
                PrintfArray(lArray,len);
              _tprintf(L"\n----------------\n");
  
  /
                if( lArray )
                {
                        delete [] lArray;
                        lArray=0;
                }
                //if(lArray)
                //{
                // free(lArray);
                // lArray=0;
                //}

 
}

下面以类方式创建


//#define UNICODE
//#define _UNICODE
#include <stdio.h>
#include <windows.h>
#include <tchar.h>
class HexStringConvertor
{
private:
        bool IsHexChar(TCHAR c)//c为十六进字符返回true,否则返回false
        {
		if(	TEXT('a') <= c && c <= TEXT('f')  ||
			TEXT('A') <= c && c <= TEXT('F')  ||
			TEXT('0') <= c && c <= TEXT('9') 	)
		{
			return true;
		}
		else
		{
			return false;
		}
        }
        int HexStrScan(  long  *m_lArray )
        {
        //第一次传m_lArray=NULL可取得字符串中包含十六进制数值个数
                TCHAR *pStart=0,*pEnd=0;//pStrat初始指向m_lpszHexBuffer,用于遍历;pEnd于_tcstol()中返回,指向第一个不能转换的字符地址
                int iArrayItemMax=0;//iArrayItemMax为十六进数个数的计数器
              int lenHexBuffer=lstrlen(m_lpszHexBuffer);
                pStart=m_lpszHexBuffer;
	     while( pStart <lenHexBuffer+m_lpszHexBuffer ) //  error: while( *pStart!=TEXT('\0') )
                {
                        if( IsHexChar( *pStart ) )
                        {
                                long lret = _tcstol(pStart, &pEnd/*返回指向第一个不能转换的字符地址*/, 16/*字符串当作几进*/);
                                if( m_lArray!=NULL ) //第二次传m_lArray!=NULL将取得十六进制数值存入m_lArray
                                {
                                        m_lArray[ iArrayItemMax ]=lret;
                                        _tprintf(TEXT("[%02d][%8X] pStart:%p(%c),pEnd:%p(%c)\n"),iArrayItemMax, lret ,pStart,*pStart,pEnd,*pEnd );//%x不要用于输出地址,要用%p代
				}
                                iArrayItemMax++;
                                pStart=pEnd;
                        }
                        pStart++;
                }
                return iArrayItemMax;
        }
        void HexStringInit(TCHAR *lpszHexBuffer )
        {
		m_lpszHexBuffer=lpszHexBuffer;
        	_tprintf(TEXT("\n------------HexStringInit() AND HexStrScan()----------------\n"));
        	_tprintf( TEXT("HexString:\"%s\"\n"), m_lpszHexBuffer );
        	if( m_lArray )
		{
			delete [] m_lArray;
			m_lArray=0;
		}
                m_TotalArrayItem= HexStrScan( NULL ); //参数传NULL可取得字符串中包含十六进制数值个数
                m_lArray=new long[ m_TotalArrayItem ];
		HexStrScan( m_lArray );
        }
public:
	void SetString(TCHAR *lpszHexBuffer )
	{
		HexStringInit( lpszHexBuffer );
	}
        HexStringConvertor( TCHAR *lpszHexBuffer )
        {
		m_lArray=0;//必上,
                HexStringInit( lpszHexBuffer );
        }
        ~HexStringConvertor()
        {
                if( m_lArray )
                {
                        delete [] m_lArray;
                        m_lArray=0;
                }
                m_lpszHexBuffer=NULL;
        }
        int size(void)
        {
		           return m_TotalArrayItem;
        }
        long operator[](int index) const
        {
		           return m_lArray[ index ];
        }
        void PrintfArray(void)
        {
		_tprintf(TEXT("PrintfArray():\n"));
	       for(int j=0;j<m_TotalArrayItem;++j)
                {
                        _tprintf( TEXT("[%02d]:%8X \t"),j,m_lArray[j]);
                        if(j%6==5) _tprintf(TEXT("\n"));
                }
                _tprintf(TEXT("\n") );
        }
	void CheckChar(void)
	{
	       for(int i=0;i<lstrlen(m_lpszHexBuffer);++i)
		{
			_tprintf(TEXT("[%03d]: %c ->"),i,m_lpszHexBuffer[i] );
			IsHexChar(m_lpszHexBuffer[i])?_tprintf( TEXT("true\n") ):_tprintf( TEXT("false\n") );
		}
	}
private:
                int     m_TotalArrayItem;
                long    *m_lArray;
                TCHAR 	*m_lpszHexBuffer;
};
int _tmain()
{
	HexStringConvertor s= TEXT("ghikjlmnopqrstuvwxyz!!#@$@%$@%&*&*$&#)$0s0xfa<-") ;
	_tprintf(TEXT("\nTEST size(),operator[]:\n"));
	for(int i=0;i<s.size();++i)
	{
		_tprintf( TEXT("(i:%02d)[%X]\t"),i,s[i]);
		if(i%6==5) _tprintf(TEXT("\n"));
	}
	_tprintf(TEXT("\n"));
	s.PrintfArray();
	TCHAR *s0=TEXT("^_^ieee-CCCC 0 0xa31E <*)>>>=< and --<-<-<@ 89a00b^-^I'll see what I can do.12 34 56 78 9a bc de f0^_^char0xface");
	s.SetString( s0 );
	s.PrintfArray();
	s.SetString( TEXT("_1,2=3+4 5/6*7!8@9#0$a%b^c&d(e)f~") );
	s.PrintfArray();
	s.SetString( TEXT("0X10x20x30xa0xb 0xc0xd0xe\00xf") );
	s.PrintfArray();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值