c# c#转utf8 - 如何将UTF-8字节[]转换为字符串?




6 Answers

string result = System.Text.Encoding.UTF8.GetString(byteArray);
gbk string

我有一个从我刚刚知道的文件中加载的byte[]数组包含UTF-8 。 在一些调试代码中,我需要将其转换为字符串。 有没有一个班轮可以做到这一点?

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




当你不知道编码时从字节数组转换为字符串的一般解决方案:

static string BytesToStringConverted(byte[] bytes)
{
    using (var stream = new MemoryStream(bytes))
    {
        using (var streamReader = new StreamReader(stream))
        {
            return streamReader.ReadToEnd();
        }
    }
}



byte[]转换为string似乎很简单,但任何类型的编码都可能会混淆输出字符串。 这个小函数的工作原理没有任何意外的结果:

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

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

    return response;
}



还有类UnicodeEncoding,使用非常简单:

ByteConverter = new UnicodeEncoding();
string stringDataForEncoding = "My Secret Data!";
byte[] dataEncoded = ByteConverter.GetBytes(stringDataForEncoding);

Console.WriteLine("Data after decoding: {0}", ByteConverter.GetString(dataEncoded));



用于将从文件中读取的字节数组byteArrFilename转换为纯粹的ASCII格式的以零结尾的字符串的Linq byteArrFilename字符将是:用于读取旧归档格式中的文件索引表之类的东西。

String filename = new String(byteArrFilename.TakeWhile(x => x != 0)
                              .Select(x => x < 128 ? (Char)x : '?').ToArray());

我用'?' 作为任何不是纯粹ascii的默认字符,但是当然可以改变。 如果你想确定你能检测到它,只需使用'\0' ,因为TakeWhile在开始时确保以这种方式构建的字符串不可能包含来自输​​入源的'\0'值。




据我所知,没有任何给定的答案保证无效终止的正确行为。 直到有人以不同的方式显示我,我用下面的方法编写了我自己的静态类来处理这个问题

// 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[]解析为一个以空字符结尾的字符串数组。 在简单情况下可以安全地忽略它




Related

c# .net arrays string type-conversion