C语言十六进制数据同字符串的相互转换

  1. #include "stdafx.h"   
  2.   
  3. #include <string>   
  4. #include <iostream>   
  5. #include <cctype>   
  6. #include <algorithm>   
  7.   
  8. /*  
  9. 入口参数:pSrc  源十六进制数据  
  10. 出口参数:dest  存放运算结果  
  11.     返回:true  转换成功  
  12.           false 失败  
  13. */   
  14. bool  Hex2String(unsigned  char  *pSrc,std::string &dest, int  nL)  
  15. {  
  16.     char  buf[256];  
  17.       
  18.     memset((char  *)buf,0, sizeof (buf));  
  19.   
  20.     unsigned char  hb;  
  21.     unsigned char  lb;  
  22.   
  23.     for ( int  i=0;i<nL;i++)  
  24.     {  
  25.         hb=(pSrc[i]&0xf0)>>4;  
  26.   
  27.         if ( hb>=0 && hb<=9 )  
  28.             hb += 0x30;  
  29.         else   if ( hb>=10 &&hb <=15 )  
  30.             hb = hb -10 + 'A' ;  
  31.         else   
  32.             return   false ;  
  33.   
  34.         lb = pSrc[i]&0x0f;  
  35.         if ( lb>=0 && lb<=9 )  
  36.             lb += 0x30;  
  37.         else   if ( lb>=10 && lb<=15 )  
  38.             lb = lb - 10 + 'A' ;  
  39.         else   
  40.             return   false ;  
  41.   
  42.         buf[i*2]   = hb;  
  43.         buf[i*2+1] = lb;  
  44.     }  
  45.     dest = buf;  
  46.     return   true ;  
  47. }  
  48.   
  49. /*  
  50. 入口参数:src  源字符串  
  51. 出口参数:dest  存放运算结果  
  52.     返回:true  转换成功  
  53.           false 失败  
  54. */   
  55. bool  String2Hex(std::string &src,unsigned  char  *dest)  
  56. {  
  57.     unsigned char  hb;  
  58.     unsigned char  lb;  
  59.   
  60.     if (src.size()%2!=0)  
  61.         return   false ;  
  62.   
  63.     transform(src.begin(), src.end(), src.begin(), toupper);  
  64.   
  65.     for ( int  i=0, j=0;i<src.size();i++)  
  66.     {  
  67.         hb=src[i];  
  68.         if ( hb>= 'A'  && hb<= 'F'  )  
  69.             hb = hb - 'A'  + 10;  
  70.         else   if ( hb>= '0'  && hb<= '9'  )  
  71.             hb = hb - '0' ;  
  72.         else   
  73.             return   false ;  
  74.   
  75.         i++;  
  76.         lb=src[i];  
  77.         if ( lb>= 'A'  && lb<= 'F'  )  
  78.             lb = lb - 'A'  + 10;  
  79.         else   if ( lb>= '0'  && lb<= '9'  )  
  80.             lb = lb - '0' ;  
  81.         else   
  82.             return   false ;  
  83.   
  84.         dest[j++]=(hb<<4)|(lb);  
  85.     }  
  86.     return   true ;  
  87. }  
  88.   
  89. //下面是使用举例,在VisualStudio2008+SP1中调试通 过   
  90. int  _tmain( int  argc, _TCHAR* argv[])  
  91. {  
  92.     unsigned char  srcB[]={0x12,0x34,0x56,0x78,0x90,0xab,0xbc,0xcd,0xde,0xef};  
  93.   
  94.     std::string strDest;  
  95.   
  96.     Hex2String(srcB,strDest,sizeof (srcB));  
  97.     std::cout<<"HexToString:" <<strDest<<std::endl;  
  98.   
  99.     if (String2Hex(strDest,srcB))  
  100.         std::cout<<"StringToHex:Success!" <<std::endl;  
  101.     else   
  102.         std::cout<<"StringToHex:Failed!" <<std::endl;  
  103.   
  104.     return  0;  

在C语言中,将十六进制数据转换字符串通常涉及将每个字节的高四位和低四位分别提取出来,然后将其转换为对应的ASCII字符。以下是一个具体的实现方法: ### 十六进制字符串的实现 该函数 `hex_to_asciistring` 接受三个参数: - `u8* str`:指向十六进制数据的指针。 - `u32 size`:表示数据的长度(以字节为单位)。 - `u8* str1`:用于存储转换后的字符串结果。 函数通过逐字节处理数据,将每个字节拆分为两个四位的十六进制字符,并将它们转换为对应的ASCII字符。 ```c void hex_to_asciistring(u8* str, u32 size, u8* str1) { u8 deposit[2]; u16 i = 0; u8 j = 0; for (i = 0; i < size; i++) { deposit[1] = str[i] & 0x0F; // 提取低四位 deposit[0] = (str[i] & 0xF0) >> 4; // 提取高四位 for (j = 0; j < 2; j++) { switch (deposit[j]) { case 0x00: str1[i * 2 + j] = '0'; break; case 0x01: str1[i * 2 + j] = '1'; break; case 0x02: str1[i * 2 + j] = '2'; break; case 0x03: str1[i * 2 + j] = '3'; break; case 0x04: str1[i * 2 + j] = '4'; break; case 0x05: str1[i * 2 + j] = '5'; break; case 0x06: str1[i * 2 + j] = '6'; break; case 0x07: str1[i * 2 + j] = '7'; break; case 0x08: str1[i * 2 + j] = '8'; break; case 0x09: str1[i * 2 + j] = '9'; break; case 0x0A: str1[i * 2 + j] = 'A'; break; case 0x0B: str1[i * 2 + j] = 'B'; break; case 0x0C: str1[i * 2 + j] = 'C'; break; case 0x0D: str1[i * 2 + j] = 'D'; break; case 0x0E: str1[i * 2 + j] = 'E'; break; case 0x0F: str1[i * 2 + j] = 'F'; break; default: return; } } } str1[size * 2] = '\0'; // 添加字符串结束符 } ``` ### 使用示例 假设有一个十六进制数组 `u8 hex_data[] = {0xA1, 0xB1, 0xC1, 0xD1};`,可以通过以下方式将其转换字符串: ```c #include <stdio.h> #include <stdint.h> // 函数声明 void hex_to_asciistring(u8* str, u32 size, u8* str1); int main() { u8 hex_data[] = {0xA1, 0xB1, 0xC1, 0xD1}; // 示例十六进制数据 u8 result[10]; // 用于存储转换后的字符串 hex_to_asciistring(hex_data, sizeof(hex_data), result); printf("转换后的字符串: %s\n", result); // 输出: A1B1C1D1 return 0; } ``` 此方法适用于需要将十六进制数据记录为日志、调试信息或用于其他需要字符串表示的场景[^2]。 --- ### 总结 - 通过逐字节处理,将每个字节的高四位和低四位分别提取。 - 使用 `switch` 语句将四位的十六进制转换为对应的ASCII字符。 - 最终结果存储在目标字符串中,并以 `\0` 结尾。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值