#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 и ниже.