Вопрос

у меня есть byte[] массив, загружаемый из файла, который мне известен, содержит UTF-8.В некотором отладочном коде мне нужно преобразовать его в строку.Есть ли один лайнер, который сделает это?

Под прикрытием это должно быть просто распределение и копировать в память, поэтому даже если это не реализовано, это должно быть возможно.

Это было полезно?

Решение

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

Другие советы

Существует как минимум четыре разных способа сделать это преобразование.

<Ол>
  • Кодирование GetString
    , но вы не сможете вернуть исходные байты, если эти байты имеют символы не ASCII.

  • BitConverter.ToString
    Выходные данные " - " строка с разделителями, но нет встроенного метода .NET для преобразования строки обратно в байтовый массив.

  • Convert.ToBase64String
    Вы можете легко преобразовать выходную строку обратно в байтовый массив, используя Convert.FromBase64String .
    Примечание. Выходные данные Строка может содержать «+», «/» и «=». Если вы хотите использовать строку в URL-адресе, вам нужно явно ее кодировать.

  • HttpServerUtility.UrlTokenEncode
    Вы можете легко преобразовать выходную строку обратно в байтовый массив, используя HttpServerUtility.UrlTokenDecode . Выходная строка уже совместима с URL! Недостатком является необходимость сборки System.Web , если ваш проект не является веб-проектом.

  • Полный пример:

    byte[] bytes = { 130, 200, 234, 23 }; // A byte array contains non-ASCII (or non-readable) characters
    
    string s1 = Encoding.UTF8.GetString(bytes); // ���
    byte[] decBytes1 = Encoding.UTF8.GetBytes(s1);  // decBytes1.Length == 10 !!
    // decBytes1 not same as bytes
    // Using UTF-8 or other Encoding object will get similar results
    
    string s2 = BitConverter.ToString(bytes);   // 82-C8-EA-17
    String[] tempAry = s2.Split('-');
    byte[] decBytes2 = new byte[tempAry.Length];
    for (int i = 0; i < tempAry.Length; i++)
        decBytes2[i] = Convert.ToByte(tempAry[i], 16);
    // decBytes2 same as bytes
    
    string s3 = Convert.ToBase64String(bytes);  // gsjqFw==
    byte[] decByte3 = Convert.FromBase64String(s3);
    // decByte3 same as bytes
    
    string s4 = HttpServerUtility.UrlTokenEncode(bytes);    // gsjqFw2
    byte[] decBytes4 = HttpServerUtility.UrlTokenDecode(s4);
    // decBytes4 same as bytes
    

    Общее решение для преобразования байтового массива в строку, когда вы не знаете кодировку:

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

    Определение:

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

    С использованием:

    string result = input.ConvertByteToString();
    

    Преобразование byte [] в string кажется простым, но любой вид кодирования может испортить выходную строку. Эта маленькая функция просто работает без каких-либо неожиданных результатов:

    private string ToString(byte[] bytes)
    {
        string response = string.Empty;
    
        foreach (byte b in bytes)
            response += (Char)b;
    
        return response;
    }
    

    Используя (byte) b.ToString (" x2 ") , выдает b4b5dfe475e58b67

    public static class Ext {
    
        public static string ToHexString(this byte[] hex)
        {
            if (hex == null) return null;
            if (hex.Length == 0) return string.Empty;
    
            var s = new StringBuilder();
            foreach (byte b in hex) {
                s.Append(b.ToString("x2"));
            }
            return s.ToString();
        }
    
        public static byte[] ToHexBytes(this string hex)
        {
            if (hex == null) return null;
            if (hex.Length == 0) return new byte[0];
    
            int l = hex.Length / 2;
            var b = new byte[l];
            for (int i = 0; i < l; ++i) {
                b[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
            }
            return b;
        }
    
        public static bool EqualsTo(this byte[] bytes, byte[] bytesToCompare)
        {
            if (bytes == null && bytesToCompare == null) return true; // ?
            if (bytes == null || bytesToCompare == null) return false;
            if (object.ReferenceEquals(bytes, bytesToCompare)) return true;
    
            if (bytes.Length != bytesToCompare.Length) return false;
    
            for (int i = 0; i < bytes.Length; ++i) {
                if (bytes[i] != bytesToCompare[i]) return false;
            }
            return true;
        }
    
    }
    

    Существует также класс UnicodeEncoding, довольно простой в использовании:

    ByteConverter = new UnicodeEncoding();
    string stringDataForEncoding = "My Secret Data!";
    byte[] dataEncoded = ByteConverter.GetBytes(stringDataForEncoding);
    
    Console.WriteLine("Data after decoding: {0}", ByteConverter.GetString(dataEncoded));
    

    Альтернативно:

     var byteStr = Convert.ToBase64String(bytes);
    

    Однострочная строка Linq для преобразования байтового массива byteArrFilename , считанного из файла, в чистую строку с нулевым окончанием в стиле ascii C будет выглядеть так: Удобно для чтения таких вещей, как таблицы индексов файлов в старых архивные форматы.

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

    Я использую '?' в качестве символа по умолчанию для всего, что здесь не чисто ascii, но это, конечно, можно изменить. Если вы хотите быть уверены, что можете его обнаружить, просто используйте вместо этого '\ 0' , так как TakeWhile в начале гарантирует, что строка, построенная таким образом, не может содержать < code> '\ 0' значения из входного источника.

    Класс

    BitConverter может использоваться для преобразования byte [] в string .

    var convertedString = BitConverter.ToString(byteAttay);
    

    Документация класса BitConverter может быть найдена на MSDN

    Насколько мне известно, ни один из приведенных ответов не гарантирует правильного поведения с нулевым завершением. Пока кто-то не показывает мне по-другому, я написал свой собственный статический класс для обработки этого с помощью следующих методов:

    // 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 [] как массив строк, заканчивающихся нулем. Это может быть безопасно проигнорировано в простом случае

    hier - это результат, когда вам не нужно было заниматься кодированием. Я использовал его в своем сетевом классе и отправлял двоичные объекты в виде строки с ним.

            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);
            }
    

    В дополнение к выбранному ответу, если вы используете .NET 35 или .NET35 CE, вы должны указать индекс первого байта для декодирования и количество байтов для декодирования:

    string result = System.Text.Encoding.UTF8.GetString(byteArray,0,byteArray.Length);
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top