byte[] b={104,1,2,3,4,5,6,104,81,0,10,6,10,17,10,0,6,10,17,10,0,150,22};
转成字符串:
string s=System.Text.Encoding.Default.GetString(b);
//s的内容为:hhQ\0\n\n\n\0\n\n\0?
//其s的长度为22,原字节数组长度为23,少了一个。
//再从s转成字节数组
byte[] bs=System.Text.Encoding.GetEncoding("GB2312").GetBytes(s);
//bs的值变成了:{104,1,2,3,4,5,6,104,81,0,10,6,10,17,10,0,6,10,17,10,0,63}
//与原来的b不相同了
诚:向大家请教:如何把一个字节数组转成字符串,再从字符串转成字节数组
且请告诉我为什么会这样原因,谢谢?
16 个解决方案
#1
字节数组转成字符串:
System.Text.Encoding.Default.GetString();
字符串转成字节数组:
System.Text.Encoding.Default.GetBytes();
System.Text.Encoding.Default.GetString();
字符串转成字节数组:
System.Text.Encoding.Default.GetBytes();
#2
字符串是多1个,因为最后是0嘛。
而你用什么方式变成的string,就必须用方式变回来。就像楼上说的
而你用什么方式变成的string,就必须用方式变回来。就像楼上说的
#3
字节数组未必能转为字符串,除非它里面存放的就是正确的字符串编码
#4
我看到数组里面有1,2,3,4,5,6,显然不是字符串编码
怎么能转为字符串呢?强制转换,系统会自动丢弃不能转换的部分的
怎么能转为字符串呢?强制转换,系统会自动丢弃不能转换的部分的
#5
反过来字符串转成字节数组,再字节数组转回字符串,是没有问题的,只要使用相同的Encoding
#6
你原来的字节数组转换后有不能识别的码{150,22},转成字符串后,系统自动把它变成{?},
你再转字节数组,最后的{63}就是{?}的编码,它取代了{150,22}
你再转字节数组,最后的{63}就是{?}的编码,它取代了{150,22}
#7
更正:从字符串转成字节数组是用的byte[] bs=System.Text.Encoding.Default.GetBytes(s);
只是发帖子时还在调试,不小心帖错了:)
其实结果都是一样的-->不能正确从字符串返回到字符数组。
To:liangxf0022(小新) 是字符串少一位,而不是字符串多一位。
To:viena(维也纳nn) 我的目是向串口发送数据,因使用的控件限制,发送的数据必须是字符串格式(不能更换串口控件),但我现在就有这样的一个字节数组,请问,有怎样才能转换成字符串发送出去呢?谢谢
只是发帖子时还在调试,不小心帖错了:)
其实结果都是一样的-->不能正确从字符串返回到字符数组。
To:liangxf0022(小新) 是字符串少一位,而不是字符串多一位。
To:viena(维也纳nn) 我的目是向串口发送数据,因使用的控件限制,发送的数据必须是字符串格式(不能更换串口控件),但我现在就有这样的一个字节数组,请问,有怎样才能转换成字符串发送出去呢?谢谢
#8
To: laladeng() 你说的对,那我应该怎么办呢 ):
#9
转为16进制字符串
#10
byte[] b={104,1,2,3,4,5,6,104,81,0,10,6,10,17,10,0,6,10,17,10,0,150,22};
string str = BitConverter.ToString(b);
string str = BitConverter.ToString(b);
#11
68-01-02-03-04-05-06-68-51-00-0A-06-0A-11-0A-00-06-0A-11-0A-00-96-16
#12
自己实现序列化吧。
#13
//字符串转回字节数组
string str = "68-01-02-03-04-05-06-68-51-00-0A-06-0A-11-0A-00-06-0A-11-0A-00-96-16";
string[] astr = str.Split('-');
byte[] abt = new byte[astr.Length];
for(int i=0;i<abt.Length;i++)
{
abt[i] = Convert.ToByte(astr[i],16);
}
string str = "68-01-02-03-04-05-06-68-51-00-0A-06-0A-11-0A-00-06-0A-11-0A-00-96-16";
string[] astr = str.Split('-');
byte[] abt = new byte[astr.Length];
for(int i=0;i<abt.Length;i++)
{
abt[i] = Convert.ToByte(astr[i],16);
}
#14
To: viena(维也纳nn):这种方法我试过,但串口接收数据是按ASSII码接收并显示的。
如:68,接收到后,为:36 38
6的ASCII-->36
8的ASCII-->38
本来0X68作为一个字节发送,但接收到后,把0x68当成了“68”,然后按位转成ASCII,成了36 38了 ):
我该怎么办
如:68,接收到后,为:36 38
6的ASCII-->36
8的ASCII-->38
本来0X68作为一个字节发送,但接收到后,把0x68当成了“68”,然后按位转成ASCII,成了36 38了 ):
我该怎么办
#15
晕,转回去就好了
string s = "";
s += (char)36;
s += (char)38;//s="68"
string s = "";
s += (char)36;
s += (char)38;//s="68"
#16
呵呵
#1
字节数组转成字符串:
System.Text.Encoding.Default.GetString();
字符串转成字节数组:
System.Text.Encoding.Default.GetBytes();
System.Text.Encoding.Default.GetString();
字符串转成字节数组:
System.Text.Encoding.Default.GetBytes();
#2
字符串是多1个,因为最后是0嘛。
而你用什么方式变成的string,就必须用方式变回来。就像楼上说的
而你用什么方式变成的string,就必须用方式变回来。就像楼上说的
#3
字节数组未必能转为字符串,除非它里面存放的就是正确的字符串编码
#4
我看到数组里面有1,2,3,4,5,6,显然不是字符串编码
怎么能转为字符串呢?强制转换,系统会自动丢弃不能转换的部分的
怎么能转为字符串呢?强制转换,系统会自动丢弃不能转换的部分的
#5
反过来字符串转成字节数组,再字节数组转回字符串,是没有问题的,只要使用相同的Encoding
#6
你原来的字节数组转换后有不能识别的码{150,22},转成字符串后,系统自动把它变成{?},
你再转字节数组,最后的{63}就是{?}的编码,它取代了{150,22}
你再转字节数组,最后的{63}就是{?}的编码,它取代了{150,22}
#7
更正:从字符串转成字节数组是用的byte[] bs=System.Text.Encoding.Default.GetBytes(s);
只是发帖子时还在调试,不小心帖错了:)
其实结果都是一样的-->不能正确从字符串返回到字符数组。
To:liangxf0022(小新) 是字符串少一位,而不是字符串多一位。
To:viena(维也纳nn) 我的目是向串口发送数据,因使用的控件限制,发送的数据必须是字符串格式(不能更换串口控件),但我现在就有这样的一个字节数组,请问,有怎样才能转换成字符串发送出去呢?谢谢
只是发帖子时还在调试,不小心帖错了:)
其实结果都是一样的-->不能正确从字符串返回到字符数组。
To:liangxf0022(小新) 是字符串少一位,而不是字符串多一位。
To:viena(维也纳nn) 我的目是向串口发送数据,因使用的控件限制,发送的数据必须是字符串格式(不能更换串口控件),但我现在就有这样的一个字节数组,请问,有怎样才能转换成字符串发送出去呢?谢谢
#8
To: laladeng() 你说的对,那我应该怎么办呢 ):
#9
转为16进制字符串
#10
byte[] b={104,1,2,3,4,5,6,104,81,0,10,6,10,17,10,0,6,10,17,10,0,150,22};
string str = BitConverter.ToString(b);
string str = BitConverter.ToString(b);
#11
68-01-02-03-04-05-06-68-51-00-0A-06-0A-11-0A-00-06-0A-11-0A-00-96-16
#12
自己实现序列化吧。
#13
//字符串转回字节数组
string str = "68-01-02-03-04-05-06-68-51-00-0A-06-0A-11-0A-00-06-0A-11-0A-00-96-16";
string[] astr = str.Split('-');
byte[] abt = new byte[astr.Length];
for(int i=0;i<abt.Length;i++)
{
abt[i] = Convert.ToByte(astr[i],16);
}
string str = "68-01-02-03-04-05-06-68-51-00-0A-06-0A-11-0A-00-06-0A-11-0A-00-96-16";
string[] astr = str.Split('-');
byte[] abt = new byte[astr.Length];
for(int i=0;i<abt.Length;i++)
{
abt[i] = Convert.ToByte(astr[i],16);
}
#14
To: viena(维也纳nn):这种方法我试过,但串口接收数据是按ASSII码接收并显示的。
如:68,接收到后,为:36 38
6的ASCII-->36
8的ASCII-->38
本来0X68作为一个字节发送,但接收到后,把0x68当成了“68”,然后按位转成ASCII,成了36 38了 ):
我该怎么办
如:68,接收到后,为:36 38
6的ASCII-->36
8的ASCII-->38
本来0X68作为一个字节发送,但接收到后,把0x68当成了“68”,然后按位转成ASCII,成了36 38了 ):
我该怎么办
#15
晕,转回去就好了
string s = "";
s += (char)36;
s += (char)38;//s="68"
string s = "";
s += (char)36;
s += (char)38;//s="68"
#16
呵呵