У меня есть byte[]
массив, который загружается из файла, который, как мне известно, содержит UTF-8 .
В некотором отладочном коде мне нужно преобразовать его в строку. Есть ли один лайнер, который сделает это?
Под обложками должно быть только выделение и мемкопия , поэтому, даже если это не реализовано, это должно быть возможно.
Ответы:
источник
System.Text.Encoding.UTF8.GetString(buf).TrimEnd('\0');
.Есть как минимум четыре разных способа сделать это преобразование.
Кодирует GetString
, но вы не сможете вернуть исходные байты, если эти байты имеют символы не ASCII.
BitConverter.ToString
Выходные данные представляют собой строку с разделителем «-», но нет встроенного метода .NET для преобразования строки обратно в байтовый массив.
Convert.ToBase64String
Вы можете легко преобразовать выходную строку обратно в байтовый массив, используя
Convert.FromBase64String
.Примечание. Выходная строка может содержать «+», «/» и «=». Если вы хотите использовать строку в URL, вам необходимо явно ее кодировать.
HttpServerUtility.UrlTokenEncode
Вы можете легко преобразовать выходную строку обратно в байтовый массив, используя
HttpServerUtility.UrlTokenDecode
. Выходная строка уже совместима с URL! Недостатком является необходимостьSystem.Web
сборки, если ваш проект не является веб-проектом.Полный пример:
источник
var decBytes2 = str.Split('-').Select(ch => Convert.ToByte(ch, 16)).ToArray();
Общее решение для преобразования байтового массива в строку, когда вы не знаете кодировку:
источник
Определение:
С помощью:
источник
Преобразование
byte[]
в astring
кажется простым, но любой вид кодирования может испортить выходную строку. Эта маленькая функция просто работает без каких-либо неожиданных результатов:источник
Использование
(byte)b.ToString("x2")
, Выходыb4b5dfe475e58b67
источник
Существует также класс UnicodeEncoding, довольно простой в использовании:
источник
UnicodeEncoding
самое плохое имя класса когда-либо; Юникод вообще не является кодировкой. Этот класс на самом деле UTF-16. Версия с прямым порядком байтов, я думаю.В качестве альтернативы:
источник
Однострочный Linq для преобразования байтового массива,
byteArrFilename
считанного из файла, в чистую строку с нулевым окончанием в стиле ascii C будет выглядеть так: Удобно для чтения таких вещей, как таблицы индексов файлов в старых форматах архивов.Я использую в
'?'
качестве значения по умолчанию char для чего-то не чистого ascii, но это, конечно, можно изменить. Если вы хотите быть уверены, что можете обнаружить его, просто используйте'\0'
вместо этого, так какTakeWhile
в начале гарантирует, что строка, построенная таким образом, не может содержать'\0'
значения из входного источника.источник
BitConverter
класс может быть использован для преобразованияbyte[]
вstring
.Документация
BitConverter
класса может быть найдена на MSDNисточник
Насколько мне известно, ни один из приведенных ответов не гарантирует правильного поведения с нулевым завершением. Пока кто-то не показывает мне по-другому, я написал свой собственный статический класс для обработки этого с помощью следующих методов:
Причина
startIndex
была в примере, над которым я работал конкретно, мне нужно было проанализироватьbyte[]
массив как массив строк с нулевым символом в конце. Это может быть безопасно проигнорировано в простом случаеисточник
byteArr.TakeWhile(x => x != 0)
это быстрый и простой способ решить проблему нулевого завершения.hier - это результат, когда вам не нужно было беспокоиться о кодировке. Я использовал его в своем сетевом классе и отправлял двоичные объекты в виде строки с ним.
источник
В дополнение к выбранному ответу, если вы используете .NET35 или .NET35 CE, вы должны указать индекс первого байта для декодирования и количество байтов для декодирования:
источник
Попробуйте это консольное приложение:
источник
Я видел некоторые ответы в этом посте, и это можно считать законченным базовым знанием, потому что есть несколько подходов в программировании на C # для решения той же проблемы. Единственное, что необходимо учитывать, - это разница между Pure UTF-8 и UTF-8 с BOM .
На прошлой неделе, на моей работе, мне нужно было разработать одну функциональность, которая выводит файлы CSV с BOM и другие CSV с чистым UTF-8 (без BOM), каждый тип кодировки файла CSV будет использоваться различными нестандартизированными API, API читает UTF-8 с спецификацией, а другой API читает без спецификации. Мне нужно изучить ссылки на эту концепцию, читая «В чем разница между UTF-8 и UTF-8 без спецификации? », Обсуждение стека переполнения и эту ссылку в Википедии « Порядок следования байтов », чтобы построить мой подход.
Наконец, мое программирование на C # для обоих типов кодирования UTF-8 (с BOM и pure) должно быть примерно таким, как в следующем примере:
источник
источник