Как преобразовать байтовый массив в строку

Я создал байтовый массив с двумя строками. Как преобразовать массив байтов в строку?

var binWriter = new BinaryWriter(new MemoryStream());
binWriter.Write("value1");
binWriter.Write("value2");
binWriter.Seek(0, SeekOrigin.Begin);

byte[] result = reader.ReadBytes((int)binWriter.BaseStream.Length);

Я хочу преобразовать result в строку. Я мог бы сделать это с помощью BinaryReader, но не могу использовать BinaryReader (он не поддерживается).


person Oksana    schedule 25.07.2012    source источник
comment
У вас уже есть строки, поэтому вы не можете делать именно это - что именно вы делаете?   -  person harold    schedule 25.07.2012
comment
@harold из строки «value1 / 2» Думаю, это просто пример.   -  person Hi-Angel    schedule 30.03.2015
comment
OP не принял ответ, предполагающий кодировку UTF-8, но принял другой ответ, предполагая, что предполагать кодировку UTF-8 небезопасно.   -  person Raedwald    schedule 23.11.2017
comment
Вы можете просто сделать new String(result)   -  person Seraf    schedule 10.09.2018


Ответы (4)


В зависимости от кодировки, которую вы хотите использовать:

var str = System.Text.Encoding.Default.GetString(result);
person eulerfx    schedule 25.07.2012
comment
Вы также должны использовать класс кодирования для записи строки в массив байтов. - person Servy; 25.07.2012
comment
На самом деле это дает забавный результат, потому что он написал строку с перегрузкой BinaryWriter.Write (string), которая сначала сохраняет длину строки. - person harold; 25.07.2012
comment
Обратите внимание, что это очистит байты, которые входят в строку, в соответствии с кодировкой. Если вы хотите проверить неверную последовательность байтов для этой кодировки, используйте метод BlockCopy, приведенный ниже от HforHisham. - person Nick Westgate; 02.09.2014
comment
Также важно знать, что System.Text.Encoding.Default - это текущая кодовая страница ANSI системы - результаты этого будут различаться в зависимости от того, как настроена операционная система. Если вы знаете, что такое кодировка строки на самом деле, вам следует использовать ее. - person Wolfgang; 05.11.2015
comment
Это не правильно. Из кода в вопросе кодировка - UTF8, по умолчанию для BinaryWriter. - person Tom Blodget; 13.02.2016
comment
См. stackoverflow.com/questions/10611455/ - person Raedwald; 23.11.2017

Предполагая, что вы используете кодировку UTF-8:

string convert = "This is the string to be converted";

// From string to byte array
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(convert);

// From byte array to string
string s = System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length);
person ba0708    schedule 25.07.2012
comment
Этот ответ избавляет читателей от неизбежного поиска в Google другого направления конверсии. - person Zoomzoom; 25.07.2018
comment
Этот ответ более точен из-за спецификации кодировки и другого побочного преобразования. - person pcdro; 20.09.2018
comment
Какие достоинства приносит System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length); по сравнению с System.Text.Encoding.UTF8.GetString(buffer);? - person Wouter Vanherck; 06.11.2018
comment
@WouterVanherck Судя по справочнику, немного. - person JAD; 01.03.2019
comment
Также работайте для меня BitConverter.ToString(byteArray)) docs.microsoft .com / en-us / dotnet / api / - person Arsen; 04.07.2021

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

char[] chars = new char[bytes.Length / sizeof(char)];
System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
string str = new string(chars);
person HforHisham    schedule 15.12.2012
comment
У меня это не сработало. У меня ошибка длины (без деления получается нужная мне длина). После получения правильной длины у меня возникло исключение argumentsException, пытающееся построить строку. - person David Silva Smith; 20.10.2013
comment
Это работает, только если ваша строка была закодирована с помощью UTF16, который является внутренняя схема кодировки строки C # по умолчанию. Если, скажем, массив байтов был закодирован просто с помощью символов ASCII из исходной строки (при условии, что это может быть), после BlockCopy каждый символ будет сжат двумя такими символами ASCII, что явно неверно. - person KFL; 14.08.2014
comment
С другой стороны, если вы пытаетесь создать поврежденную строку для тестирования, это как раз то, что нужно сделать. Спасибо! - person Nick Westgate; 02.09.2014
comment
Я не думаю, что вам нужно беспокоиться о кодировании, если вы хотите преобразовать только в строку, а затем обратно, см. stackoverflow.com/questions/472906/ - person mcmillab; 15.09.2014
comment
Я думаю, если вы используете Math.Ceiling на bytes.Length / sizeof(char), то он всегда будет работать правильно. - person Lukasz; 09.06.2015

Чтобы преобразовать byte [] в строку [], просто используйте строку ниже.

byte[] fileData; // Some byte array
//Convert byte[] to string[]
var table = (Encoding.Default.GetString(
                 fileData, 
                 0, 
                 fileData.Length - 1)).Split(new string[] { "\r\n", "\r", "\n" },
                                             StringSplitOptions.None);
person Mansoor Ali    schedule 22.05.2013