十六进制转换成字符串

//
十六进制数怎么转化为中文字符
我调用别人封装好的一个函数从网络上接收数据,发现接收到的都是十六进制数据,本来接收到的应该是中文字符,我应该用什么函数把十六进制数据转化为中文,屏幕上输出。   
  用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了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值