关于C++中实现这符转换的函数占用这个位置好久了,一直没有时间来写,最近也没搞开发了,所以以前的一些拿出来总结下,免得自己忘记。
1、字符转换成十六进制码(这里的参数是一次转换两个字符)
#define MarcoHex(x,y) (x>'9'?x-'7':x-'0')<<4 + (y>'9'?y-'7':y-'0');调用这个宏,这里szStr = "FF",int nHex = MarcoBCD(szStr[0],szStr[1])后,nHex = 0xFF;
2、整形转换成BCD码:
int型数据为四个字节,数据很大,先考虑10分位的数据;int x = 12,我们只需要进行下面转换就可以得到10分位的BCD码:char y = (x/10)<<4 + x%10,此时y的值便是0x12;
3、字符串转换成BCD码(字符串将每两个字符存入一个BCD字符)
int bcd(char *_src, int _ln, char *_dst)
{
int ln;
BYTE *szbuz = new BYTE[_ln + 128];
assert(NULL != szbuz);
BYTE *dst = szbuz;
BYTE *src = _src;
for(; *src; src++) { *src = toupper( *src );}
src = _src;
for( ln = 0; ln < _ln; ln += 2, src++, dst++)
{
*dst = CheckNumber(*src) << 4;
src++;
*dst += CheckNumber(*src);
}
ln = dst - szbuz;
memcpy(_dst, szbuz, ln);
delete[] szbuz;
return ln;
}
4、反转函数
WORD ReverseWORD(WORD src)
{
#define CSHORT(x) (((x) & 0x00FF) << 8) + (((x) & 0xFF00) >> 8)
return CSHORT(src);
}
//---------------------------------------------------------------------------
DWORD ReverseDWORD(DWORD src)
{
#define CLONG(x) (((x) & 0x000000FF) << 24 ) + (((x) & 0x0000FF00) << 8 ) /
+ (((x) & 0x00FF0000) >> 8 ) + (((x) & 0xFF000000) >> 24 )
return CLONG(src);
}
//---------------------------------------------------------------------------
void ReversePCHAR(char *p, const int len )
{
char* szbuz = (char*)malloc( len + 1 );
memcpy(szbuz,p,len);
for( int i = 0 ; i < len ; i ++)
{
p[len - i - 1] = szbuz[i];
}
free(szbuz);
}
//---------------------------------------------------------------------------
WORD BCD2WORD(const WORD src)
{
#define B2I(x) (((((x) & 0xF0) >> 4) * 10) + ((x) & 0x0F))
return B2I(src);
}
//---------------------------------------------------------------------------
DWORD SecondTimer()
{
LARGE_INTEGER count, freq, ns;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter( &count );
ns.QuadPart = count.QuadPart / freq.QuadPart;
return ns.LowPart;
}
//---------------------------------------------------------------------------
short INT2BCD(const short src)
{
#define I2B(x) (((x % 100) / 10) << 4) + ((x % 100) % 10)
return I2B(src);
}
//---------------------------------------------------------------------------
void PCHAR2BCD(const char *src, char *dest, int len)
{
char *szbuz = new char[len + 1];
memcpy(szbuz, src, len);
char *point = szbuz;
for( int i = 0; i < len; i += 2)
{
*point = toupper(*point);
if(( *point <= '9' ) && (*point >= '0'))
*dest = (*point - '0') << 4;
else if(( *point <= 'F' ) && (*point >= 'A'))
*dest = (*point - '7') << 4;
else *dest = 0;
point++;
*point = toupper(*point);
if(( *point <= '9' ) && (*point >= '0'))
*dest += (*point - '0') ;
else if(( *point <= 'F' ) && (*point >= 'A'))
*dest += (*point - '7') ;
else *dest += 0;
point++;
dest++;
}
delete[] szbuz;
}
//---------------------------------------------------------------------------
int PCHAR2BIN(char *src, unsigned int len)
{
int result = 0;
len = len > strlen(src) ? strlen(src):len;
for(unsigned int i = 0 ;i < len ;i ++ )
{
result += src[len - i - 1] == '1' ? 1 :0 ;
if (i < len - 1)
result = result << 1;
}
return result;
}
//---------------------------------------------------------------------------
void BIN2PCHAR(char *dest, const int src)
{
int x = src;
int len = sizeof(src) * 8 ;
char *p = dest + len - 1;
for(int i = 0 ; i < len; i ++)
{
*p-- = (x & 0x01) + 0x30;
x = x >> 1;
}
}
//---------------------------------------------------------------------------
void PCHAR2HEX(char *dest, const char * src, int len)
{
if( !len ) len = strlen(src);
while(len -- )
{
sprintf(dest,"%02x",*src++);
dest += 2;
}
}
//---------------------------------------------------------------------------
void SplitPCHAR(char ** dest, char * src, DWORD nlen)
{
unsigned int clen = strlen(src);
do
{
memcpy(*dest++,src,nlen < strlen(src) ? nlen: strlen(src));
src += nlen;
}
while ( clen - nlen );
}
//---------------------------------------------------------------------------
我不认为上述函数有实用价值,特别对于上层软件的开发,很多功能都将我所陈述的内容实现要更高效,更安全,这只不过是一种方式去了解它们而已。
没有初始的指针是没有意义的,sizeof不能用于获取动态数组的大小;
如查要获得一个指针地址所指向的字符串的长度,应该使用strlen;
取得指针地址的长度是sizeof((int)&ptr);