在调试串口常常碰到须要把读出来的hex data转化成string类型输出,记录下来web
//字节流转换为十六进制字符串
//itoa,16进制变字符串,1字节变两字节svg
void ByteToHexStr(const unsigned char* source, char* dest, int sourceLen)
{
short i;
unsigned char highByte, lowByte;
for (i = 0; i < sourceLen; i++)
{
highByte = source[i] >> 4;
lowByte = source[i] & 0x0f ;
highByte += 0x30;
if (highByte > 0x39)
dest[i * 2] = highByte + 0x07;
else
dest[i * 2] = highByte;
lowByte += 0x30;
if (lowByte > 0x39)
dest[i * 2 + 1] = lowByte + 0x07;
else
dest[i * 2 + 1] = lowByte;
}
return ;
}
//字节流转换为十六进制字符串的另外一种实现方式调试
void Hex2Str( const char *sSrc, char *sDest, int nSrcLen )
{
int i;
char szTmp[3];
for( i = 0; i < nSrcLen; i++ )
{
sprintf( szTmp, "%02X", (unsigned char) sSrc[i] );
memcpy( &sDest[i * 2], szTmp, 2 );
}
return ;
}
//十六进制字符串转换为字节流
//atoi,2个字符串字符变一个十六进制字节code
void HexStrToByte(const char* source, unsigned char* dest, int sourceLen)
{
short i;
unsigned char highByte, lowByte;
for (i = 0; i < sourceLen; i += 2)
{
highByte = toupper(source[i]);
lowByte = toupper(source[i + 1]);
if (highByte > 0x39)
highByte -= 0x37;
else
highByte -= 0x30;
if (lowByte > 0x39)
lowByte -= 0x37;
else
lowByte -= 0x30;
dest[i / 2] = (highByte << 4) | lowByte;
}
return ;
}
int main()
{
//char data[] = {0xFF,0x26,0xA0,0x0B,0xFF};
char data[] = "FF26A00BFF12";
char buffer[100];
char i=0;
memset(buffer, 0, sizeof(buffer));
//ByteToHexStr(data, buffer, sizeof(data));
//Hex2Str(data, buffer, sizeof(data));
//printf("convert after:%d, %02x\n", strlen(buffer),buffer[i]);
HexStrToByte(data,buffer,strlen(data));
for(i=0;i
{
printf("convert after:%d, %02x\n", strlen(buffer),buffer[i]);
}
}