16进制串转数值数组Hexstr2Array
来源:互联网 发布:windows me 系统安装 编辑:程序博客网 时间:2024/06/07 10:12
#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();}
- 16进制串转数值数组Hexstr2Array
- 基本数组类型转数组
- 布尔转数值
- 数字字符串转数值
- C++字符串转数值
- php字符串转数组、数组转字符串
- js数组转字符串,字符串转数组
- JavaScript 数组转字符串,字符串转数组
- js数组转字符串,字符串转数组
- JavaScript 数组转字符串,字符串转数组
- php字符串转数组,数组转字符串
- List转数组,数组转List
- js数组转字符串,字符串转数组
- list转数组,数组转list
- iOS字符串转数组,数组转字符串
- 数组转集合,集合转数组
- Java 数组类型字符串转数组
- 类数组转数组方法详解
- C/C++编程规范
- sed 和 awk的使用
- Future的使用
- 关于汉字的编程
- PHP中超全局变量$GLOBALS和global的区别
- 16进制串转数值数组Hexstr2Array
- C++实现二叉树的递归和非递归遍历方法
- U-Boot在内核为Cortex-A8的飞思卡尔处理器i.MX53上的移植
- 专业学习期望与规划
- Future 实例
- Pascal's Triangle 打印Pascal三角 @LeetCode
- Section 2: Console Tab : Using Commandline API in Firebug
- Ubuntu命令大全
- 调试小程序