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