请教:如何把一个字节数组转成字符串,再从字符串转成字节数组?

时间:2022-11-05 22:42:59
有这样一个字节数组:
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();

#2


字符串是多1个,因为最后是0嘛。

而你用什么方式变成的string,就必须用方式变回来。就像楼上说的

#3


字节数组未必能转为字符串,除非它里面存放的就是正确的字符串编码

#4


我看到数组里面有1,2,3,4,5,6,显然不是字符串编码
怎么能转为字符串呢?强制转换,系统会自动丢弃不能转换的部分的

#5


反过来字符串转成字节数组,再字节数组转回字符串,是没有问题的,只要使用相同的Encoding

#6


你原来的字节数组转换后有不能识别的码{150,22},转成字符串后,系统自动把它变成{?},
你再转字节数组,最后的{63}就是{?}的编码,它取代了{150,22}

#7


更正:从字符串转成字节数组是用的byte[] bs=System.Text.Encoding.Default.GetBytes(s);
只是发帖子时还在调试,不小心帖错了:)
其实结果都是一样的-->不能正确从字符串返回到字符数组。
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);

#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);
}

#14


To: viena(维也纳nn):这种方法我试过,但串口接收数据是按ASSII码接收并显示的。
如: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"

#16


呵呵

#1


字节数组转成字符串:
System.Text.Encoding.Default.GetString();
字符串转成字节数组:
System.Text.Encoding.Default.GetBytes();

#2


字符串是多1个,因为最后是0嘛。

而你用什么方式变成的string,就必须用方式变回来。就像楼上说的

#3


字节数组未必能转为字符串,除非它里面存放的就是正确的字符串编码

#4


我看到数组里面有1,2,3,4,5,6,显然不是字符串编码
怎么能转为字符串呢?强制转换,系统会自动丢弃不能转换的部分的

#5


反过来字符串转成字节数组,再字节数组转回字符串,是没有问题的,只要使用相同的Encoding

#6


你原来的字节数组转换后有不能识别的码{150,22},转成字符串后,系统自动把它变成{?},
你再转字节数组,最后的{63}就是{?}的编码,它取代了{150,22}

#7


更正:从字符串转成字节数组是用的byte[] bs=System.Text.Encoding.Default.GetBytes(s);
只是发帖子时还在调试,不小心帖错了:)
其实结果都是一样的-->不能正确从字符串返回到字符数组。
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);

#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);
}

#14


To: viena(维也纳nn):这种方法我试过,但串口接收数据是按ASSII码接收并显示的。
如: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"

#16


呵呵