我有一个字节[]数组,从一个文件加载,我碰巧知道包含UTF-8。

在一些调试代码中,我需要将其转换为字符串。是否有一个单行程序可以做到这一点?

在表面之下,它应该只是一个分配和一个memcopy,所以即使没有实现,也应该是可能的。


当前回答

定义:

public static string ConvertByteToString(this byte[] source)
{
    return source != null ? System.Text.Encoding.UTF8.GetString(source) : null;
}

使用:

string result = input.ConvertByteToString();

其他回答

将字节[]转换为字符串似乎很简单,但任何一种编码都有可能把输出字符串弄乱。这个小函数只是工作,没有任何意想不到的结果:

private string ToString(byte[] bytes)
{
    string response = string.Empty;

    foreach (byte b in bytes)
        response += (Char)b;

    return response;
}
string result = ASCIIEncoding.UTF8.GetString(byteArray);

定义:

public static string ConvertByteToString(this byte[] source)
{
    return source != null ? System.Text.Encoding.UTF8.GetString(source) : null;
}

使用:

string result = input.ConvertByteToString();

据我所知,没有一个给出的答案保证正确的行为与空终止。直到有人告诉我不同的,我写了自己的静态类处理以下方法:

// Mimics the functionality of strlen() in c/c++
// Needed because niether StringBuilder or Encoding.*.GetString() handle \0 well
static int StringLength(byte[] buffer, int startIndex = 0)
{
    int strlen = 0;
    while
    (
        (startIndex + strlen + 1) < buffer.Length // Make sure incrementing won't break any bounds
        && buffer[startIndex + strlen] != 0       // The typical null terimation check
    )
    {
        ++strlen;
    }
    return strlen;
}

// This is messy, but I haven't found a built-in way in c# that guarentees null termination
public static string ParseBytes(byte[] buffer, out int strlen, int startIndex = 0)
{
    strlen = StringLength(buffer, startIndex);
    byte[] c_str = new byte[strlen];
    Array.Copy(buffer, startIndex, c_str, 0, strlen);
    return Encoding.UTF8.GetString(c_str);
}

使用startIndex的原因是在我正在处理的示例中,我需要将byte[]解析为一个以null结尾的字符串数组。在简单的情况下,可以安全地忽略它

这是一个不需要编码的结果。我在我的网络类中使用它,并以字符串的形式发送二进制对象。

public static byte[] String2ByteArray(string str)
{
    char[] chars = str.ToArray();
    byte[] bytes = new byte[chars.Length * 2];

    for (int i = 0; i < chars.Length; i++)
        Array.Copy(BitConverter.GetBytes(chars[i]), 0, bytes, i * 2, 2);

    return bytes;
}

public static string ByteArray2String(byte[] bytes)
{
    char[] chars = new char[bytes.Length / 2];

    for (int i = 0; i < chars.Length; i++)
        chars[i] = BitConverter.ToChar(bytes, i * 2);

    return new string(chars);
}