Hex To Ascii

//以下是关于 hex 转换为 ascii的代码,一开始还觉得不以为然,但真正动手,还是发现一些急需完善的东东,
//比如考虑输入的问题,还有大小写的问题
//很多情况下,是无法预测用户的输入的,唯一能做的是,把程序完善得非常perfection


#include <iostream>

using namespace std;


int binarySearch(int *a, int len, int val)
{
int beg, mid, end;
beg = 0;
end = len - 1;
while (beg < end - 1)
{
mid = beg + (end - beg) / 2;
if(a[mid] <= val) beg = mid;
else end = mid;
}
if(a[end] == val) return end;
else if(a[beg] == val) return beg;
return -1;
}

#define ISDIGIT(a) ('0' <= (a) && '9' >= (a))
#define ISUP(a) ('A' <= (a) && 'F' >= (a))
#define ISLO(a) ('a' <= (a) && 'f' >= (a))


bool ToUp(char * s)
{
char *p = s;
while('0' == *p) ++p;
if('x' == *p || 'X' == *p) ++p;
while (*p)
{
if(ISDIGIT(*p) || ISUP(*p)) ++p;
else if(ISLO(*p))
{
*p -= 32;
++p;
}
else return false;
}
return true;
}

char ExHexToAscii(const char a, const char b)
{
char c;
if(ISDIGIT(a) && ISDIGIT(b)) c = (a << 4) | (b & 0x0F);
else if(ISDIGIT(a) && ISUP(b)) c = (a << 4) | (b - 0x37);
else if(ISUP(a) && ISDIGIT(b)) c = ((a - 0x37) << 4) | (b & 0x0F);
else if(ISUP(a) && ISUP(b)) c = ((a - 0x37) << 4) | (b - 0x37);
return c;
}

char *HexToAscii(const char *sHex, char *sasc, int len)
{
const char *p = sHex;
char *q = sasc;

while('0' == *p) ++p;
if('x' == *p || 'X' == *p) ++p;

if(len % 2)
{
*q = ExHexToAscii('0', *p);
++q;
++p;
}
for (; *p; )
{
*q = ExHexToAscii(*p, *(p + 1));
p += 2;
++q;
}
return sasc;
}


int main()
{
char str[1024] = {0};
char hex[] = "0x313233343536373839d6D0";

if(ToUp(hex))
{
cout << HexToAscii(hex, str, strlen(hex)) << endl;
}
else
{
cout << "Error" << endl;
}


return 0;
}
posted @ 2011-12-13 17:12  Anbit自由之路  阅读(1222)  评论(0编辑  收藏  举报