Есть ли способ адаптировать эту функцию, чтобы она не использовала LINQ? (преобразовать массив байтов в строку)

#c# #.net #linq

#c# #.net #linq

Вопрос:

Есть ли способ, которым я могу изменить эту функцию, которая преобразует массивы байтов в строку, чтобы она не использовала LINQ? (чтобы сделать ее совместимой с предыдущими версиями .NET)?

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

Большинство методов, найденных в Интернете, похоже, возвращают непечатаемую строку в юникоде. Приведенный выше код возвращает безопасную строку (например, b8b30dcfcac41ebd5313107adf7054024fb1ac69, а не множество символов высокого ASCII), однако я не совсем понимаю, что делает приведенная выше функция (особенно в отношении параметра «x2».

Комментарии:

1. Вот ссылка на то, что делает «x2»: msdn.microsoft.com/en-us/library/dwhawy9k.aspx

2. x2 вернет 2-шестнадцатизначную строковую интерпретацию числа. Итак, если b = 10 b.toString возвращает 0a. X2 вернет 0A (заглавная буква A).

3. Почему вы не хотите использовать LINQ?

Ответ №1:

Конечно, вы можете просто включить это в foreach цикл, если все, что вы хотите сделать, это сделать приведенный выше код «не LINQ». 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, который вы перечисляете.

Ответ №2:

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

Кстати, вы можете использовать Linq для объектов, когда вы нацелены на .NET 2, благодаря LINQBridge (вам, конечно, все еще нужен VS2008)

Комментарии:

1. С оговоркой, что .Replace вызов, вероятно, снизит производительность. Однако читаемость может превзойти это.

Ответ №3:

Это то, что вы ищете:

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

И наоборот:

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

Комментарии:

1. Похоже, ему нужно шестнадцатеричное представление байтов, так что это, вероятно, не то, что он ищет.

2. Правильно понял — получается нечитаемая строка. Я не очень удачно сформулировал свой вопрос, поскольку не был точно уверен, что делает функция, но, как говорит Роджер, мне нужны шестнадцатеричные байты в виде строки.

Ответ №4:

Сначала вам просто нужно преобразовать ваши байты во что-то более полезное, например, в UTF8, а затем вы можете получить из него свою строку. Что-то вроде (в моем случае: iso-8859-1):

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

Ответ №5:

Есть ли способ, которым я могу изменить эту функцию, которая преобразует массивы байтов в строку, чтобы она не использовала LINQ? (чтобы сделать ее совместимой с предыдущими версиями .NET)?

Предполагая, что вы все еще можете использовать C # 3 или более позднюю версию, вы можете сделать:

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

однако я не совсем понимаю, что делает функция выше
(особенно в отношении параметра «x2».

Он преобразует каждый байт в шестнадцатеричное представление (два символа), а затем объединяет все эти символы в одну строку. Смотрите шестнадцатеричный («X») спецификатор формата в стандартных строках числового формата.

Комментарии:

1. Но это все еще использует операторы LINQ (=>), поэтому не будет работать в .NET 2.0

2. @Nick G: Это не оператор «LINQ», это оператор «goes to» — часть лямбда-выражения. Она никак не привязана к LINQ, только к C # 3 или более поздней версии. Вы все еще можете использовать их в проектах на C # и для .NET 2.0, если используете новый компилятор.

Ответ №6:

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

параметр «x2» применяется к функции класса byte toString(), применяемой для каждого экземпляра, с требованием вывода 2(2), шестнадцатеричных(x), строчных символов.

Это то, что происходит под запросом select, он принимает строковое представление байтов и объединяет их все в результирующую строку в качестве возвращаемого аргумента вызова функции.

Я ответил на ваш вопрос?

Я не вижу ничего плохого в использовании запросов LINQ.

Комментарии:

1. LINQ недоступен в более ранних версиях .NET

2. @ChrisF: Держи язык за зубами, чувак, я работаю над .NET 4.5, и в настоящее время из Windows Developer Preview, и LINQ доступен по крайней мере для версии FW 4.0, поэтому в вопросе не указана точная версия FW для компиляции, так что не набирай свои голоса

3. Было совершенно очевидно, что я имел в виду версии .NET, где LINQ недоступен. Ie, 2.0 и ниже.