如何将字节[]转换为字符串?每次我尝试,我都

系统。Byte []

而不是数值。

另外,我如何得到十六进制而不是小数的值?


当前回答

有一个内置的方法:

byte[] data = { 1, 2, 4, 8, 16, 32 };

string hex = BitConverter.ToString(data);

结果:01-02-04-08-10-20

如果你想要没有破折号,只需删除它们:

string hex = BitConverter.ToString(data).Replace("-", string.Empty);

结果:010204081020

如果你想要一个更紧凑的表示,你可以使用Base64:

string base64 = Convert.ToBase64String(data);

结果:AQIECBAg

其他回答

这里没人提到你为什么会有"系统"字节[]"字符串,而不是值,所以我将。

当一个对象隐式转换为String类型时,程序将默认使用该对象的公共String ToString()方法,该方法从System继承而来。对象:

public virtual string ToString()
{
    return this.GetType().ToString();
}

如果你发现你经常进行这种转换,你可以简单地创建一个包装器类,并像这样重写这个方法:

public override string ToString()
{
    // do the processing here
    // return the nicely formatted string
}

现在每次打印这个包装器对象时,你将得到你自己的值,而不是this. gettype (). tostring()的值。

十六进制,Linq-fu:

string.Concat(ba.Select(b => b.ToString("X2")).ToArray())

与时俱进

正如@RubenBartelink所指出的,没有将IEnumerable<string>转换为数组的代码:ba。Select(b => b. tostring ("X2"))在4.0之前不工作,相同的代码现在在4.0上工作。

这段代码…

byte[] ba = { 1, 2, 4, 8, 16, 32 };

string s = string.Concat(ba.Select(b => b.ToString("X2")));
string t = string.Concat(ba.Select(b => b.ToString("X2")).ToArray());

Console.WriteLine (s);
Console.WriteLine (t);

...在。net 4.0之前,输出是:

System.Linq.Enumerable+<CreateSelectIterator>c__Iterator10`2[System.Byte,System.String]
010204081020

在。net 4.0以后,字符串。Concat有一个接受IEnumerable的重载。因此,在4.0版本中,上述代码对于变量s和t将有相同的输出

010204081020
010204081020

4.0之前,ba。Select(b => b.ToString("X2"))将重载(对象arg0), IEnumerable<string>进入适当重载的方式,即(params string[] values),是我们需要将IEnumerable<string>转换为字符串数组。4.0之前,字符串。Concat有10个过载功能,在4.0现在是12个

正如其他人所说,这取决于字节数组中值的编码方式。尽管如此,您还是需要非常小心地处理这类事情,否则您可能会尝试转换未被所选编码处理的字节。

Jon Skeet有一篇关于。net中的编码和unicode的好文章。推荐阅读。

:

byte[] data = new byte[] { 0x01, 0x02, 0x03, 0x0D, 0x0E, 0x0F };
string hex = string.Empty;
data.ToList().ForEach(b => hex += b.ToString("x2"));
// use "X2" for uppercase hex letters
Console.WriteLine(hex);

结果:0102030 d0e0f

再向这个堆中添加一个答案,有一个System.Runtime.Remoting.Metadata.W3cXsd2001。SoapHexBinary类,我已经使用它可以转换字节和十六进制:

string hex = new SoapHexBinary(bytes).ToString();
byte[] bytes = SoapHexBinary.Parse(hex).Value;

不确定它与其他实现(基准)相比如何,但在我看来,它非常简单——特别是从十六进制转换回字节。