C#ByteString到ASCII字符串
我正在寻找一种聪明的方法,将十六进制字节值字符串转换为“真实文本”(ASCII字符)字符串 例如,我用十六进制ASCII:48 45 4C 4C 4F写了单词“Hello”。使用某种方法,我希望接收它的ASCII文本(在本例中为“Hello”) 我确信有一个框架方法。如果不是这样,我当然可以实现我自己的方法 谢谢C#ByteString到ASCII字符串,c#,.net,bytearray,C#,.net,Bytearray,我正在寻找一种聪明的方法,将十六进制字节值字符串转换为“真实文本”(ASCII字符)字符串 例如,我用十六进制ASCII:48 45 4C 4C 4F写了单词“Hello”。使用某种方法,我希望接收它的ASCII文本(在本例中为“Hello”) 我确信有一个框架方法。如果不是这样,我当然可以实现我自己的方法 谢谢 var str = Encoding.UTF8.GetString(SoapHexBinary.Parse("48454C4C4F").Value); //HELLO PS:Soap
var str = Encoding.UTF8.GetString(SoapHexBinary.Parse("48454C4C4F").Value); //HELLO
PS:SoapHexBinary
位于System.Runtime.Remoting.Metadata.W3cXsd2001
命名空间中
PS:SoapHexBinary
位于System.Runtime.Remoting.Metadata.W3cXsd2001
命名空间中
我确信有一个框架方法
单一框架方法:否
但是,第二部分:将包含ASCII编码文本的字节数组转换为.NET字符串(即UTF-16编码的Unicode)确实存在:具体方法是:
第一部分很容易自己完成:一次取两个十六进制数字,解析为十六进制,并转换为字节
,以存储在数组中。比如:
byte[] HexStringToByteArray(string input) {
Debug.Assert(input.Length % 2 == 0, "Must have two digits per byte");
var res = new byte[input.Length/2];
for (var i = 0; i < input.Length/2; i++) {
var h = input.Substring(i*2, 2);
res[i] = Convert.ToByte(h, 16);
}
return res;
}
byte[]HexstringToByte数组(字符串输入){
Assert(input.Length%2==0,“每个字节必须有两位数”);
var res=新字节[input.Length/2];
对于(变量i=0;i
编辑:注意:在.NET中标识一个更容易完成第一部分的方法:这是一种更好的方法,可以自己编写(而在一个模糊的命名空间中,它是在mscorlib中实现的,而不需要额外的引用)
我确信有一个框架方法
单一框架方法:否
但是,第二部分:将包含ASCII编码文本的字节数组转换为.NET字符串(即UTF-16编码的Unicode)确实存在:具体方法是:
第一部分很容易自己完成:一次取两个十六进制数字,解析为十六进制,并转换为字节
,以存储在数组中。比如:
byte[] HexStringToByteArray(string input) {
Debug.Assert(input.Length % 2 == 0, "Must have two digits per byte");
var res = new byte[input.Length/2];
for (var i = 0; i < input.Length/2; i++) {
var h = input.Substring(i*2, 2);
res[i] = Convert.ToByte(h, 16);
}
return res;
}
byte[]HexstringToByte数组(字符串输入){
Assert(input.Length%2==0,“每个字节必须有两位数”);
var res=新字节[input.Length/2];
对于(变量i=0;i
编辑:注意:在.NET中标识一个更容易完成第一部分的方法:这是一种更好的方法,可以自己编写(在一个可能不太清楚的命名空间中,它是在mscorlib中实现的,而不需要额外的引用)。StringBuilder sb=new StringBuilder();
对于(int i=0;i
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
您有两个问题。首先必须,然后才能调用。首先将十六进制字符串转换为,然后使用Encoding.ASCII
(或者更好的方法,UTF8)将字节转换为string.System.Text.Encoding.ASCII.GetString(buf);你有两个问题。首先必须,然后才能调用。首先将十六进制字符串转换为,然后使用Encoding.ASCII
(或者更好的方法,UTF8)将字节转换为string.System.Text.Encoding.ASCII.GetString(buf);您不认为使用System.Runtime
将十六进制字符串转换为字节数组有点牵强吗?作为你们团队中的一名新程序员,在理解之前我会眨两下眼睛。但对于Encoding.ASCII
@L.B,快速提问,为什么//见鬼?好吧,但我还有一个问题。如果我有像äöü这样的信件,它们会被“销毁”。有没有办法将这个输入值从ASCII转换为unicode或可以显示特殊字符的东西?我从一个我无法更改的硬件中获取输入字符串。@ElMac它肯定不是ASCII。尝试使用不同的编码,例如Windows-1252
,Windows-1254
等。用法:Encoding.GetEncoding(“Windows-1252”).GetString(…)
你不认为使用System.Runtime
将十六进制字符串转换为字节数组有点牵强吗?作为你们团队中的一名新程序员,在理解之前我会眨两下眼睛。但对于Encoding.ASCII
@L.B,快速提问,为什么//见鬼?好吧,但我还有一个问题。如果我有像äöü这样的信件,它们会被“销毁”。有没有办法将这个输入值从ASCII转换为unicode或可以显示特殊字符的东西?我从一个我无法更改的硬件中获取输入字符串。@ElMac它肯定不是ASCII。尝试使用不同的编码,如Windows-1252
,Windows-1254
等。用法:Encoding.GetEncoding(“Windows-1252”).GetString(…)
断言()
非常好用,很高兴看到它被简单正确地使用!Assert()!一个问题:为什么无符号整数
作为中间类型而不是字节
?一个问题:为什么无符号整数
作为中间类型而不是字节
?
byte[] HexStringToByteArray(string input) {
Debug.Assert(input.Length % 2 == 0, "Must have two digits per byte");
var res = new byte[input.Length/2];
for (var i = 0; i < input.Length/2; i++) {
var h = input.Substring(i*2, 2);
res[i] = Convert.ToByte(h, 16);
}
return res;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hexStr.Length; i += 2)
{
string hs = hexStr.Substring(i, 2);
sb.Append(Convert.ToByte(hs, 16));
}