有没有办法调整这个功能,所以它不使用LINQ? (将字节数组转换为字符串)

时间:2011-11-09 15:15:52

标签: c# .net linq

有没有办法可以改变这个函数,它将字节数组转换为字符串,所以它不使用LINQ? (使其与以前的.NET版本兼容)?

private string ByteToString(byte[] data)
{
    return String.Concat(data.Select(b => b.ToString("x2")));
}

网上发现的大多数方法似乎都返回了一个不可打印的unicode字符串。上面的代码返回一个安全的字符串(例如b8b30dcfcac41ebd5313107adf7054024fb1ac69而不是高位ASCII字符的加载)但是我真的不明白上面的函数在做什么(特别是关于“x2”参数。

6 个答案:

答案 0 :(得分:3)

当然,如果您只想将代码设置为“非LINQ”,则可以将其转换为foreach循环。 String.Concat()只是将IEnumerable连接成一个字符串,我们可以使用StringBuilder

private string ByteToString(byte[] data)
{
    var builder = new StringBuilder();

    for (int i=0; i<data.Length; i++)
    {
        builder.Append(data[i].ToString("x2"));
    }

    return builder.ToString();
}

可能有很多方法可以做到这一点,但这可能是您列出的LINQ代码的相当直译。

答案 1 :(得分:0)

private string ByteToString(byte[] data)
{
    return BitConverter.ToString(data).Replace("-", "").ToLowerInvariant();
}

顺便说一下,当你使用{2}时,你可以使用Linq到对象,感谢LinqBridge(你当然还需要VS2008)

答案 2 :(得分:0)

这就是你要找的东西:

  string s = System.Text.Encoding.UTF8.GetString(bytes);

反过来说:

  byte[] bytes = System.Text.Encoding.UTF8.GetBytes(s);

答案 3 :(得分:0)

首先,您只需将字节转换为更有用的字符,例如UTF8,然后您就可以从中获取字符串。 像(在我的情况下:iso-8859-1):

    buf = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), Encoding.UTF8, buf);
    tempString = Encoding.UTF8.GetString(buf, 0, count);

答案 4 :(得分:0)

  

有没有办法可以改变这个将字节数组转换为的函数   一个字符串,所以它不使用LINQ? (使其与先前的兼容   .NET版本)?

假设你仍然可以使用C#3或更高版本,你可以这样做:

 return string.Concat(Array.ConvertAll(data, b => b.ToString("x2")));
  

但是我真的不明白上面的功能在做什么   (特别是关于“x2”参数。

它将每个字节转换为十六进制表示(两个字符),然后将所有这些字符连接成一个字符串。请参阅Standard Numeric Format Strings中的十六进制(“X”)格式说明符。

答案 5 :(得分:-1)

private string ByteToString(byte[] data)
{
    return String.Concat(data.Select(b => b.ToString("x2")));
}

“x2”参数应用于 byte 的类函数 ToString(),适用于每个实例,需要输出< strong> 2 (2),十六进制(x),小写字符。

这就是select查询下面的内容,它接受字节的字符串表示,并将所有字符串连接到结果字符串作为函数调用的返回参数。

我是否回答了你的问题?

我认为使用LINQ查询没有任何问题。