在C++中如何将十六进制转换为ASCII码

时间:2021-08-07 17:21:05
我现在在项目需要实现将十六进制转换为ASCII码,请问大侠们.怎么去算 ,如何算法代码.请贴上,高分相送.

20 个解决方案

#1


/**
将数据按高字节到低字节的顺序转换成ASCII.
@param[out] pOutBuffer 转换结果存储位置.
@param[in] pData 要转换的数据.
@param[in] nOutBytes 转换结果字节数.
@return 实际转换的字节数,和\a nOutBytes 相等.
*/
int CDeviceDriver::HexToAscii(char* pOutBuffer, const void* pData, int nOutBytes)
{
int nConverted = 0;
BYTE* p = (BYTE*)pData+nOutBytes/2-1;
int c;

if ((nOutBytes % 2) == 1)
{
c = p[1] & 0xF;
*pOutBuffer++ = (c < 10) ? (c+'0') : (c-0xA+'A');
nConverted++;
}

for(nOutBytes/=2; nOutBytes>0; nOutBytes--, p--, nConverted+=2)
{
c = (p[0] >> 4) & 0xF;
*pOutBuffer++ = (c < 10) ? (c+'0') : (c-0xA+'A');

c = p[0] & 0xF;
*pOutBuffer++ = (c < 10) ? (c+'0') : (c-0xA+'A');
}

return nConverted;
}

#2


HexToAscii(char* x)//x="41"
{
   print *x*16+*(x+1);
}

#3


如果字符串前面有 0x的话,字符串向后移下

上面的写错了,是print (*x-'0')*16+(*(x+1)-'0');

#4


你上面的转换不是十六进制转换为ASCII码 吧    Troj4n  我输入31   转换成49 了

#5


31(16进制)难道不等于 49(十进制)?

#6


我想转换成 ACSII 码     hex 31  转换成  1

#7


你看看你那可以吗

#8


ASCII本来就是0x7F范围里面的16进制啊,楼主想怎样?

char a=0x31;
CString str;
str.format("%c",a);
MessageBox(str);

这个算不算?

#9


我现在就是想  比如我的16进制的值是31,我需要把它转换成ASCII  的值为 1.  就这样   

#10


print (*x-'0')*16+(*(x+1)-'0')-30;

这样就行了

#11


上面写的30是16进制
按你的要求就这样吧  print (*x-'0')*16+(*(x+1)-'0')-0x30;或
print (*x-'0')*16+(*(x+1)-'0')-48;

#12


非常感谢  大家

#13


const char *Hex2ASC(const BYTE *Hex, int Len)
{
static char ASC[100 * 2];
int i; 

const char HEX_CODE[] = "0123456789ABCDEF";
for (i = 0; i < Len; i++)
{
ASC[i * 2] = HEX_CODE[Hex[i] >> 4];
ASC[i * 2 + 1] = HEX_CODE[Hex[i] & 0x0F];
}
ASC[i * 2] = '\0';

return ASC;
}
呵呵,30分也叫高分......

#14


如果你的答案可以,那我就给你加分了啊 .呵呵

#15


int String2Bytes( const unsigned char* pSrc, char* pDst, int nSrcLength )
{
for (int i = 0; i<(nSrcLength /2); i++)
{
pDst[i] = Tansfer(pSrc[2*i]) *16 + Tansfer(pSrc[2*i + 1]);
}
return nSrcLength/2;
}

char Tansfer( char c )
{
if (c > 47 && c < 58 )
{
c = c - 48;
}
else if ( c > 64 && c < 71)
{
c = c - 55;
}
else if (c > 96 && c < 103)
{
c-= 87;
}
return c;
}

#16


bragi523    你这是转换的也是   16进制转换成ACSII吗

#17


看了半天也没看明白你想干什么,难道不是把数据转成十六制字符串输出吗?还是十六进制字符串转换成数据?

#18


呵呵 ,是把十六进制的字符串,转换成ACSII码 了   ,比如   十六进制的数是 31   转换成ACSII 码 就是1 
 现在我正在做串口了,需要数据转换了

#19


还是糊涂啊,按我的理解,你的意思好象是把ASCII字符'1'转成整数1,ASCII字符'1'的十六进制表示形式为0x31,你想做的转换是把ASCII字符变成整型数据吧,是这个意思吗.

#20


借道问一个问题,那我们编程过程中,使用的整型数据是什么编码?
套在楼主的问题上就是从ASCII码转到**码(整型数据所属的编码)

#1


/**
将数据按高字节到低字节的顺序转换成ASCII.
@param[out] pOutBuffer 转换结果存储位置.
@param[in] pData 要转换的数据.
@param[in] nOutBytes 转换结果字节数.
@return 实际转换的字节数,和\a nOutBytes 相等.
*/
int CDeviceDriver::HexToAscii(char* pOutBuffer, const void* pData, int nOutBytes)
{
int nConverted = 0;
BYTE* p = (BYTE*)pData+nOutBytes/2-1;
int c;

if ((nOutBytes % 2) == 1)
{
c = p[1] & 0xF;
*pOutBuffer++ = (c < 10) ? (c+'0') : (c-0xA+'A');
nConverted++;
}

for(nOutBytes/=2; nOutBytes>0; nOutBytes--, p--, nConverted+=2)
{
c = (p[0] >> 4) & 0xF;
*pOutBuffer++ = (c < 10) ? (c+'0') : (c-0xA+'A');

c = p[0] & 0xF;
*pOutBuffer++ = (c < 10) ? (c+'0') : (c-0xA+'A');
}

return nConverted;
}

#2


HexToAscii(char* x)//x="41"
{
   print *x*16+*(x+1);
}

#3


如果字符串前面有 0x的话,字符串向后移下

上面的写错了,是print (*x-'0')*16+(*(x+1)-'0');

#4


你上面的转换不是十六进制转换为ASCII码 吧    Troj4n  我输入31   转换成49 了

#5


31(16进制)难道不等于 49(十进制)?

#6


我想转换成 ACSII 码     hex 31  转换成  1

#7


你看看你那可以吗

#8


ASCII本来就是0x7F范围里面的16进制啊,楼主想怎样?

char a=0x31;
CString str;
str.format("%c",a);
MessageBox(str);

这个算不算?

#9


我现在就是想  比如我的16进制的值是31,我需要把它转换成ASCII  的值为 1.  就这样   

#10


print (*x-'0')*16+(*(x+1)-'0')-30;

这样就行了

#11


上面写的30是16进制
按你的要求就这样吧  print (*x-'0')*16+(*(x+1)-'0')-0x30;或
print (*x-'0')*16+(*(x+1)-'0')-48;

#12


非常感谢  大家

#13


const char *Hex2ASC(const BYTE *Hex, int Len)
{
static char ASC[100 * 2];
int i; 

const char HEX_CODE[] = "0123456789ABCDEF";
for (i = 0; i < Len; i++)
{
ASC[i * 2] = HEX_CODE[Hex[i] >> 4];
ASC[i * 2 + 1] = HEX_CODE[Hex[i] & 0x0F];
}
ASC[i * 2] = '\0';

return ASC;
}
呵呵,30分也叫高分......

#14


如果你的答案可以,那我就给你加分了啊 .呵呵

#15


int String2Bytes( const unsigned char* pSrc, char* pDst, int nSrcLength )
{
for (int i = 0; i<(nSrcLength /2); i++)
{
pDst[i] = Tansfer(pSrc[2*i]) *16 + Tansfer(pSrc[2*i + 1]);
}
return nSrcLength/2;
}

char Tansfer( char c )
{
if (c > 47 && c < 58 )
{
c = c - 48;
}
else if ( c > 64 && c < 71)
{
c = c - 55;
}
else if (c > 96 && c < 103)
{
c-= 87;
}
return c;
}

#16


bragi523    你这是转换的也是   16进制转换成ACSII吗

#17


看了半天也没看明白你想干什么,难道不是把数据转成十六制字符串输出吗?还是十六进制字符串转换成数据?

#18


呵呵 ,是把十六进制的字符串,转换成ACSII码 了   ,比如   十六进制的数是 31   转换成ACSII 码 就是1 
 现在我正在做串口了,需要数据转换了

#19


还是糊涂啊,按我的理解,你的意思好象是把ASCII字符'1'转成整数1,ASCII字符'1'的十六进制表示形式为0x31,你想做的转换是把ASCII字符变成整型数据吧,是这个意思吗.

#20


借道问一个问题,那我们编程过程中,使用的整型数据是什么编码?
套在楼主的问题上就是从ASCII码转到**码(整型数据所属的编码)