// 

 十六进制数怎么转化为中文字符 

 我调用别人封装好的一个函数从网络上接收数据,发现接收到的都是十六进制数据,本来接收到的应该是中文字符,我应该用什么函数把十六进制数据转化为中文,屏幕上输出。    

   用c或c++语言实现.    

   谢谢! 

 问题点数:0、回复次数:6 

 Top 

   


 1 楼hzmhzmhzm(archangel)回复于 2002-09-17 17:36:20 得分 0 

 //假设hi,low中分别存放收到的两个16数    

   int   hi,   low;    

   //两字节为一个汉字    

   char   hz[3];    

   hz[0]   =   hi;    

   hz[1]   =   low;    

   hz[2]   =   0;    

        

   OK    

   

 Top 


 2 楼lyedit(lyedit)回复于 2002-09-17 17:44:05 得分 0 hzmhzmhzm(蓝甲武士), 

 怎么输出? 

 Top 


 3 楼fat_horse(每天进步一点点)回复于 2002-09-17 17:52:12 得分 0 gz,    

   好像楼上说的不大对。    

   

 Top 


 4 楼alexxing(赤铸)回复于 2002-09-17 19:09:13 得分 0 “都是十六进制数据”?    

   按你说的应该是文本形式的“十六进制”,即字符   "0123456789ABCDEF"   而不是整数数值   0x12,   0x34   之类(后者习惯叫“二进制”)    

      

   这些十六进制数可能(不知道它是怎么编码的,这么猜)是汉字GB码或内码的十六进制形式,例如汉字“汉”的GB码为   0xd6d7,它给你的应该就是字符串“D6D7”或者“D7D6”(可能高字节在前,也可能低字节在前,你得试验)    

   你的任务就是将这些字符串转换成相应的整数数值,存进二进制字符串(直接存进,而不是转换成文本字符串),一个汉字是两个字节,对应的十六进制字符串就是4个字符    

      

   #include   <ctype.h>    

      

   //   有   HEX->INT   的函数,为了向你演示原理,特意写一个    

   inline   unsigned   HexCharToInt(char   c)    

   {    

   assert(isxdigit(c));    

   return   isdigit(c)   ?   (c   -   '0')   :   (   isupper(c)   ?   (c   -   'A')   :   (c   -   'a')   );    

   }    

      

   void   HexToCC(const   char   hex_str[],   char   cc_str[2])    

   {    

   typedef   struct   {   unsigned   char   low_byte,   high_byte;   }   CC;    

   CC   *   p   =   (CC   *)   cc_str;    

   //   如果低字节在前(“字”=   "D7D6",   D7   为低字节,D6   为高字节   =>   0xD6D7)    

   p->low_byte   =   HexCharToInt(hex_str[0])   *   16U   +   HexCharToInt(hex_str[1]);    

   p->high_byte   =   HexCharToInt(hex_str[2])   *   16U   +   HexCharToInt(hex_str[3]);    

   //   如果高字节在前(“字”=   "D6D7",   D7   为低字节,D6   为高字节   =>   0xD6D7)    

   p->high_byte   =   HexCharToInt(hex_str[0])   *   16U   +   HexCharToInt(hex_str[1]);    

   p->low_byte   =   HexCharToInt(hex_str[2])   *   16U   +   HexCharToInt(hex_str[3]);    

   }    

      

   void   HexStrToCStr(const   char   hex_str[   /*   4*N   个字符   */   ],   char   cc_str[   /*   2*N+1   */   ])    

   {    

   size_t   len   =   strlen(hex_str);    

   int   N   =   len   /   4;    

   const   char   *   p_hex   =   hex_str;    

   char   *   p_cc   =   cc_str;    

   for   (   int   i   =   0;   i   <   N;   ++   i   )    

   {    

   HexToCC(p_hex,   p_cc);    

   p_hex   +=   4;    

   p_cc   +=   2;    

   }    

   cc_str[2*N]   =   0;    

   }    

      

   看懂这个程序,根据你的情况再做调整 

 Top 


 5 楼tttc(Azure)回复于 2002-09-18 02:29:15 得分 0 字符使用的是ASCII吗,其最高位是0,而汉字正是以把这一最高位置1来区分普通字符的,每个汉字占两个字节,每个字节的最高位都是1,它应该是国标码,你可通过相应的转换程序得到相应的汉字!(使用UCDOS) 




 // 

 C语言 双字节十六进制字符与单字节HEX压缩编码的转换   

 由于项目中需要双字节的十六进制字符压缩成单字节HEX压缩编码,所以不能使用我前面文章的双字节数字压缩成单字节HEX压缩编码,故改进如下: 


 char temp[100]; 

     //length为压缩后的字节数,即原来char数组a长度的一半 

 char* CHAR2HEX(int length, unsigned char* a) 

 { 

     int i, b; 

     for(i = 0; i < length; i ++) 

     { 

         char c[3]; 

         c[0] = a[0 + 2 * i]; 

         c[1] = a[1 + 2 * i]; 

         c[2] = '\0'; 

         sscanf(c, "%x", &b);      //把每两个字节的十六进制字符串转换成十六进制数字 

         temp[i] = ((b / 16) << 4) | (b % 16);      //把十六进制数字压缩成单字节并转换成字符 

     } 

     return temp; 

 } 


 //同理,单字节HEX压缩编码转换成双字节十六进制字符如下: 

 unsigned temp[100]; 

 unsigned char* HEX2CHAR(int length, unsigned char* a) 

 { 

     int i, b; 

     for(i = 0; i < length; i ++) 

     { 

         char c[2]; 

         b = ((a[i] >> 4) * 16) | (a[i] & 0x0f); 

         sprintf(c, "%X", b); 

         temp[0 + 2 * i] = c[0]; 

         temp[1 + 2 * i] = c[1]; 

     } 

     return temp; 

 } 



 // 

 一个十六进制的字符串如何转换为ascii字符串呢? 


 十六进制字符串:213032303144314239343330314646373733433030303130323030333130393030303330313032303030333030303430303035303032303033303730303038303030393030304130303031303130323031313130313132303131333031313430313135303132303031333030313331303134303031303130353032303537464134210d 



 如何转换为普通的ascii字符串呢? 

 :) 

 十六进制是别人把传输字符串转换为了十六进制的字符串,我需要还原为原来的字符串。:) 

 2007-9-5 17:28caijimin 

 真的是不明白你想做什么,为啥说那是16进制,我还觉得是10进制呢 

 2007-9-5 17:30apony 

 WINHEX 

 2007-9-5 18:45choc 

 原帖由 caijimin 于 2007-9-5 17:28 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7312153&ptid=986766][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url] 

 真的是不明白你想做什么,为啥说那是16进制,我还觉得是10进制呢   

   

 因为它最后有个D 

 2007-9-6 11:04yang_crystal 

 [table=95%][tr][td][font=FixedSys][color=#0000cc] 


 #include <stdio.h> 


 char *AsciiToChar(char *asc,char str[]) 

 { 

 int i=0,n=0,len; 

 char cTemp[1024]; 

 memset(cTemp,0x00,sizeof(cTemp)); 

 strcpy(cTemp,asc); 

 len=strlen(cTemp); 

 for(i=0;i<len;i+=2) 

   { 

         if(('0'<=cTemp[i]&&cTemp[i]<='9')&&('0'<=cTemp[i+1]&&cTemp[i+1]<='9')) 

                 str[n++]=(char)(cTemp[i]<<4|(cTemp[i+1]&0x0F)); 

         else if('0'<=cTemp[i]&&cTemp[i]<='9'&&('A'<=cTemp[i+1]&&cTemp[i+1]<='F')) 

                 str[n++]=(char)(cTemp[i]<<4|(cTemp[i+1]-0x37)); 

         else if(('A'<=cTemp[i]&&cTemp[i]<='F')&&('0'<=cTemp[i+1]&&cTemp[i+1]<='9')) 

                 str[n++]=(char)(((cTemp[i]-0x37)<<4)|(cTemp[i+1]&0x0F)); 

         else if(('A'<=cTemp[i]&&cTemp[i]<='F')&&('A'<=cTemp[i+1]&&cTemp[i+1]<='F')) 

                 str[n++]=(char)(((cTemp[i]-0x37)<<4)|(cTemp[i+1]-0x37)); 

         else 

                 printf("your input is wrong!!"); 

   } 

 str[n]='\0'; 

 return str; 

 } 


 int main() 

 { 

 char strin[1024]; 

 int i; 

 memset(strin,0x00,sizeof(strin)); 

 printf("%s\n",AsciiToChar("3132333435D6D0B6ABD6D0",strin)); 

 exit(0); 

 } 

 [/color][/font][/td][/tr][/table]不知道这个能不能达到你的要求 




 // 

 字符串和十六进制之间的转换方法 


 1.C#中的代码 

         /// <summary> 

         /// <函数:Encode> 

         /// 作用:将字符串内容转化为16进制数据编码,其逆过程是Decode 

         /// 参数说明: 

         /// strEncode 需要转化的原始字符串 

         /// 转换的过程是直接把字符转换成Unicode字符,比如数字"3"-->0033,汉字"我"-->U+6211 

         /// 函数decode的过程是encode的逆过程. 

         /// </summary> 

         /// <param name="strEncode"></param> 

         /// <returns></returns> 


         public static string Encode(string strEncode) 

         { 

             string strReturn = "";    //  存储转换后的编码 

             foreach (short shortx in strEncode.ToCharArray()) 

             { 

                 strReturn += shortx.ToString("X4"); 

             } 

             return strReturn; 

         } 


         /// <summary> 

         /// <函数:Decode> 

         ///作用:将16进制数据编码转化为字符串,是Encode的逆过程 


         /// </summary> 

         /// <param name="strDecode"></param> 

         /// <returns></returns> 


         public static string Decode(string strDecode) 

         { 

             string sResult = ""; 

             for (int i = 0; i < strDecode.Length / 4; i++) 

             { 

                 sResult += (char)short.Parse(strDecode.Substring(i * 4, 4), global::System.Globalization.NumberStyles.HexNumber); 

             } 

             return sResult; 

         } 

   


 2.VB6中的代码 

 '******************************************************************* 

  '<函数:Encode> 

 '作用:将字符串内容转化为16进制数据编码,其逆过程是Decode 

 '参数说明: 

 'strSource 需要转化的原始字符串 

 Public Function Encode(strEncode As String) As String 

     Dim i As Long 

     Dim chrTmp$ 

     Dim ByteLower$, ByteUpper$ 

     Dim strReturn$  '存储转换后的编码 

      

     For i = 1 To Len(strEncode) 

         chrTmp$ = Mid(strEncode, i, 1) 

         ByteLower$ = Hex$(AscB(MidB$(chrTmp$, 1, 1))) 

         If Len(ByteLower$) = 1 Then ByteLower$ = "0" & ByteLower$ 

         ByteUpper$ = Hex$(AscB(MidB$(chrTmp$, 2, 1))) 

         If Len(ByteUpper$) = 1 Then ByteUpper$ = "0" & ByteUpper$ 

         strReturn$ = strReturn$ & ByteUpper$ & ByteLower$ 

     Next 

      

     Encode = strReturn$ 

 End Function 

 '</函数:Encode> 


 '******************************************************************* 



 '******************************************************************* 

  '<函数:Decode> 

 '作用:将16进制数据编码转化为字符串,是Encode的逆过程 

 Public Function Decode(strDecode As String) As String 

     Dim i As Long 

     Dim strCode$ '存储转换后的编码 

     Dim chrTmp$ 


     On Error GoTo ErrProc 

      

     If Len(strDecode) Mod 4 <> 0 Then GoTo ErrProc 

     For i = 1 To Len(strDecode) Step 4 

         strCode = Mid$(strDecode, i, 4) 

         chrTmp$ = ChrW("&H" & strCode) 

         If chrTmp$ = "?" Then If strCode <> "003F" Then GoTo ErrProc 

         Decode = Decode & chrTmp$ 

     Next 

      

     Exit Function 

 ErrProc: 

     Decode = strDecode 

     DealwithEvents "不能解析的消息:" & strDecode 

 End Function 

 '</函数:Decode> 




 // 

 字节数组、数值和十六进制字符串的转换 


  . 1、将字节数组转化为数值 

 复制  保存public static int ConvertBytesToInt(byte[] arrByte, int offset) 

 { 

     return BitConverter.ToInt32(arrByte, offset); 

 } 


 2、将数值转化为字节数组 


 第二个参数设置是不是需要把得到的字节数组反转,因为Windows操作系统中整形的高低位是反转转之后保存的。 

 复制  保存public static byte[] ConvertIntToBytes(int value, bool reverse) 

 { 

     byte[] ret = BitConverter.GetBytes(value); 

     if (reverse) 

         Array.Reverse(ret); 

     return ret; 

 } 

 3、将字节数组转化为16进制字符串 

 复制  保存public static string ConvertBytesToHex(byte[] arrByte, bool reverse) 

 { 

     StringBuilder sb = new StringBuilder(); 

     if (reverse) 

         Array.Reverse(arrByte); 

     foreach (byte b in arrByte) 

         sb.AppendFormat("{0:x2}", b); 

     return sb.ToString(); 

 } 


 第二个参数的含义同上。 

 4、将16进制字符串转化为字节数组 

 复制  保存public static byte[] ConvertHexToBytes(string value) 

 { 

     int len = value.Length / 2; 

     byte[] ret = new byte[len]; 

     for (int i = 0; i < len; i++) 

         ret[i] = (byte) (Convert.ToInt32(value.Substring(i * 2, 2), 16)); 

     return ret; 

 } 



 // 

 怎样将字符串转换成十六进制以及其逆转换(翻译四)  原文连接: 


 http://www.c-sharpcorner.com/UploadFile/Joshy_geo/ 
 HexConverter10282006021521AM/HexConverter.aspx 


 怎样将字符串转换成十六进制以及其逆转换。 


  背景 

 本文将告诉你怎样将字符串转换成十六进制以及其逆转换。 


 我为我的智能卡应用而做的这个程序。较早前,我用VB写了一个但是现在我不得不将我的代码转换成C#.通常智能卡都是以十六进制的格式来写入数据的。因为我没有一个好的十六进制转换器来帮我完成这些转换,我不得不自己动手了。 


 代码 


 主要转换代码来自Microsoft.VisualBasic类。下面的代码就是将字符串转换成十六进制格式。我们不能直接将所有的字符都转换成十六进制 (例如:@#$%^&*()),因此我首先需要获得字符的ASCII码,然后再将ASCII码转换成十六进制。 


 //为此我用了一个while 循环 


 while (Data.Length > 0) 

 { 

 //首先用substring 来获取每一个字符 


 sValue= Data.Substring(0, 1).ToString() 


 //然后将字符转换成ascii       


 sValue= Strings.Asc(sValue) 


 //然后将ascii值转换成十六进制 


 sValue = Conversion.Hex(sValue) 


 //转换后就去掉该字符 


 Data = Data.Substring(1, Data.Length - 1); 


 sHex = sHex + sValue; 


 } 


 在这个应用中我使用了两个函数 


 Data_Hex_Asc(data) 


  这个函数负责将字符转换成十六进制 


 public string Data_Hex_Asc(ref string Data) 


 { 


     string Data1 = ""; 


     string sData = ""; 


     while (Data.Length > 0) 


     //first take two hex value using substring. 


     //then convert Hex value into ascii. 


     //then convert ascii value into character. 


     { 

         Data1 = System.Convert.ToChar(System.Convert.ToUInt32(Data.Substring(0, 2),  16)).ToString(); 


         sData = sData + Data1; 


          Data = Data.Substring(2, Data.Length - 2); 


     } 

     return sData; 

 } 


 Data_Asc_Hex(data) 


  这个函数负责将十六进制转换成字符 


 public string Data_Asc_Hex(ref string Data) 

 { 

     //first take each charcter using substring. 

     //then convert character into ascii. 

     //then convert ascii value into Hex Format 

     string sValue; 

     string sHex = ""; 

     while (Data.Length > 0) 

     { 

         sValue = Conversion.Hex(Strings.Asc(Data.Substring(0, 1).ToString())); 

         Data = Data.Substring(1, Data.Length - 1); 

         sHex = sHex + sValue; 

     } 

     return sHex; 

 } 




 // 

 发送十六进制字符 


     在主对话框中加入一个复选接钮,ID为IDC_CHECK_HEXSEND Caption: 十六进制发送,再利用ClassWizard为其添加控制变量:m_ctrlHexSend; 


     在ClassView中为SCommTestDlg类添加以下两个PUBLIC成员函数,并输入相应代码; 


   


 //由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔 

 //如:A1 23 45 0B 00 29 

 //CByteArray是一个动态字节数组,可参看MSDN帮助 

 int CSCommTestDlg::String2Hex(CString str, CByteArray &senddata) 

 { 

 int hexdata,lowhexdata; 

 int hexdatalen="0"; 

 int len="str".GetLength(); 

 senddata.SetSize(len/2); 

 for(int i="0";i<len;) 

 { 

 char lstr,hstr=str[i]; 

 if(hstr==' ') 

 { 

 i++; 

 continue; 

 } 

 i++; 

 if(i>=len) 

 break; 

 lstr=str[i]; 

 hexdata=ConvertHexChar(hstr); 

 lowhexdata=ConvertHexChar(lstr); 

 if((hexdata==16)||(lowhexdata==16)) 

 break; 

 else 

 hexdata=hexdata*16+lowhexdata; 

 i++; 

 senddata[hexdatalen]=(char)hexdata; 

 hexdatalen++; 

 } 

 senddata.SetSize(hexdatalen); 

 return hexdatalen; 

 } 


 //这是一个将字符转换为相应的十六进制值的函数 

 //好多C语言书上都可以找到 

 //功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1 

 char CSCommTestDlg::ConvertHexChar(char ch) 

 { 

 if((ch>='0')&&(ch<='9')) 

 return ch-0x30; 

 else if((ch>='A')&&(ch<='F')) 

 return ch-'A'+10; 

 else if((ch>='a')&&(ch<='f')) 

 return ch-'a'+10; 

 else return (-1); 

 } 


   


   再将CSCommTestDlg::OnButtonManualsend()修改成以下形式: 


 void CSCommTestDlg::OnButtonManualsend() 

 { 

 // TODO: Add your control notification handler code here 

 UpdateData(TRUE); //读取编辑框内容 

 if(m_ctrlHexSend.GetCheck()) 

 { 

 CByteArray hexdata; 

 int len="String2Hex"(m_strTXData,hexdata); //此处返回的len可以用于计算发送了多少个十六进制数 

 m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据 

 } 

 else 

 m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送ASCII字符数据 


 }


现在,你先将串口线接好并打开串口调试助手V2.1,选上以十六制显示,设置好相应串口,然后运行我们这个程序,在发送框中输入00 01 02 03 A1 CC等十六进制字符,并选上以十六进制发送,单击手动发送,在串口调试助手的接收框中应该可以看到00 01 02 03 A1 CC了。