如何将16进制字符串转换成byte[]数组?
如字符串“12B3C4”转换成{0x12,0xB3,0xC4}的byte[]数组。
问题点数:20、回复次数:15Top
1 楼zhaochong12(超级大笨鸟)回复于 2006-12-02 19:04:20 得分 0
byte[] byteArray = new byte[] { 0x01, 200 };
string s = System.Text.Encoding.Unicode.GetString (byteArray );
byte[] array = System.Text.Encoding.Unicode.GetBytes(s);
Top
2 楼zhaochong12(超级大笨鸟)回复于 2006-12-02 19:08:08 得分 0
哦, 不好意思.. 弄错了, 这个是16进制转换成字符的
int i;
byte[] bytes;
string str = Console.ReadLine();
try
{
i = System.Int32.Parse(str,System.Globalization.NumberStyles.AllowHexSpecifier);
bytes = BitConverter.GetBytes(i);
char[] chars = (new System.Text.ASCIIEncoding()).GetChars(bytes);
char c = chars[0];
chars[0] = chars[1];
chars[1] = c;
Console.WriteLine(chars);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
Top
3 楼zhaochong12(超级大笨鸟)回复于 2006-12-02 19:11:13 得分 0
再给个char[]转换byte[]
char[] mChars=new char[]{'a','b','c'};
byte[] mBytes=System.Text.Encoding.Default.GetBytes(mChars);Top
4 楼believefym(feng)回复于 2006-12-02 19:39:18 得分 0
刚学c#,写了一个简陋的,很多api还不会用
string str = "12B3C4";
byte[] bs = new byte[str.Length / 2];
char []ch = str.ToUpper().ToCharArray();
Console.WriteLine(str.ToUpper());
for (int i = 0; i < ch.Length; i += 2)
{
byte b = (byte)0;
if (ch[i] >= '0' && ch[i] <= '9')
b += (byte)((ch[i] - '0') * 16);
else if (ch[i] >= 'A' && ch[i] <= 'F')
b += (byte)((ch[i] - 'A' + 10) * 16);
if (ch[i+1] >= '0' && ch[i+1] <= '9')
b += (byte)((ch[i+1] - '0')) ;
else if (ch[i+1] >= 'A' && ch[i+1] <= 'F')
b += (byte)((ch[i+1] - 'A' + 10)) ;
bs[i/2] = b;
}
foreach(byte tmp in bs)
Console.WriteLine(""+tmp+"\t");Top
5 楼kmblack1(black)回复于 2006-12-02 19:55:41 得分 0
byte[]可以有两种表现方式,一种是10进制,一种是十六进制,对于byte[]来说,两者都是一样
直接用GetString就可以了,你用断点可以看得很清楚Top
6 楼liujia_0421(SnowLover)回复于 2006-12-02 20:39:33 得分 0
string s = "12B3C4";
byte[] array = new byte[s.Length / 2];
for (int i = 0; i < s.Length / 2; i++)
{
string str = s.Substring(i, 2);
array[i] =(byte ) Convert.ToInt32(str ,16);
Console.WriteLine(Convert.ToString(array[i], 16));
}Top
7 楼javist()回复于 2006-12-02 21:03:34 得分 0
to:zhaochong12(笨鸟)
为什么要加下面语句?
char c = chars[0];
chars[0] = chars[1];
chars[1] = c;
Top
8 楼believefym(feng)回复于 2006-12-02 21:26:55 得分 0
liujia_0421
这个简单Top
9 楼javist()回复于 2006-12-03 09:49:04 得分 0
c#有没有现成的函数?Top
10 楼liujia_0421(SnowLover)回复于 2006-12-03 11:02:36 得分 0
TO:c#有没有现成的函数?
System.Text.Encoding.Unicode.GetBytes(str)这个函数是将字符串转成二进制数组的,但不符合你的要求,它是将字符串的每个字符转成二进制...Top
11 楼javist()回复于 2006-12-04 18:04:01 得分 0
经过验证liujia_0421()的方法错,“aaaa”出来的是{0x61,0x61,0x61,0x61}
正确应该是{0xaa,0xaa}才对。Top
12 楼liujia_0421(SnowLover)回复于 2006-12-04 18:17:45 得分 0
测试如下:
string s = "aaaa";
byte[] array = new byte[s.Length / 2];
for (int i = 0; i < s.Length / 2; i++)
{
string str = s.Substring(i, 2);
array[i] = (byte)Convert.ToInt32(str, 16);
Console.WriteLine("输出十进制:"+array[i]);
Console.WriteLine("输出十六进制:"+Convert.ToString(array[i], 16));
}
输出如下:
输出十进制:170
输出十六进制:aa
输出十进制:170
输出十六进制:aa
我不知道你为什么作的测试会是0x61...
的确在字节数组中存的数是两个170,而不是你想要的0xaa...
但只是一个形式的不同,本质上是相等的...
难道十进制的170不等于十六进制的aa?
道理上是一样的...
Top
13 楼lr21shiji(睿睿)回复于 2006-12-04 19:34:32 得分 0
用tobase64可以
Top
14 楼javist()回复于 2006-12-05 18:06:30 得分 0
我是用一个文本框的文本“aaaaaaaaaaa……”作测试的,是不定长度的字符串,例如“12cdb23422a……”转换后是{0x12,0xcd,0x23,0x42,0x2a……}Top
15 楼KissApple(菊花普洱茶)回复于 2006-12-15 15:54:25 得分 0
/// <summary> Convert a string of hex digits (ex: E4 CA B2) to a byte array. </summary>
/// <param name="s"> The string containing the hex digits (with or without spaces). </param>
/// <returns> Returns an array of bytes. </returns>
private byte[] HexStringToByteArray(string s)
{
s = s.Replace(" ", "");
byte[] buffer = new byte[s.Length / 2];
for (int i = 0; i < s.Length; i += 2)
buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
return buffer;
}
我试过了以上代码可以将近55 43 54 65 ff这样的字符串转成byte数组发送出去,你可以根据你的需要修改一下Top




