C # конвертирует строку в ее байтовый эквивалент - PullRequest
7 голосов
/ 12 февраля 2009

В этот момент большинство людей будут думать: «А, нехорошо опубликовать это ..:»

byte[] dataB= System.Text.Encoding.ASCII.GetBytes(data);

Однако ... проблема у меня в том, что мне нужно точное значение байтов без кодирования, а просто чистое значение для каждого байта. Например, если значение строки (0xFF32), я хочу, чтобы оно тоже конвертировалось {255,50}. Причина этого в том, что у меня есть формат файла, который я пытаюсь прочитать, который хранит целые числа, поскольку байты сохраняют их, а затем читает их при открытии программы.

Это то, что я имею до сих пор:

...
dialog.InitialDirectory =
    Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop) +
    "/Test";

dialog.Title="Open File";

if (dialog.ShowDialog(this) == DialogResult.OK)
{
    StreamReader reader = new StreamReader(dialog.FileName);
    string data = reader.ReadToEnd();
    reader.Close();
    byte[] fileC = System.Text.Encoding.ASCII.GetBytes(data);
    File_Read(dialog.FileName,fileC);
}
...

Поэтому, когда я пытаюсь прочитать файл, он преобразует условные обозначения файлов, скажем, 0xFF в 0x3F, потому что 0xFF больше 127, а 0x3F -?

Извините, если я немного запутался:)

Спасибо, Michael

Ответы [ 6 ]

17 голосов
/ 12 февраля 2009

Проблема с вашим подходом для начала:

Мне нужно точное значение байтов без кодировки

...

Например, если значение строки (0xFF32)

Это все равно, что смотреть на картину маслом и говорить: «Я хочу байты для этой картинки без кодировки». Это не имеет смысла. Текст не совпадает с двоичными данными. Как только вы это поймете, легко разобраться в корне проблемы. Что вам действительно нужно, так это содержимое файла в виде байтового массива. Это легко, потому что файлы являются двоичными данными! Вы не должны читать это как текст в первую очередь, если это не действительно текст. К счастью, .NET делает это действительно легко:

byte[] fileC = File.ReadAllBytes(dialog.FileName);
13 голосов
/ 12 февраля 2009

Однако ... проблема у меня в том, что мне нужно точное значение байтов без кодировки, а просто чистое значение для каждого байта.

Тогда используйте это:

byte[] dataB = System.Text.Encoding.Unicode.GetBytes(data);

Возвращает байты, которые хранятся внутри строк .NET.

Но все это - codswallop: строка всегда связана с определенной кодировкой, и нет никакого способа обойти это. Выше не получится, например если файл содержит недопустимые последовательности кода Unicode (что может произойти) или путем нормализации. Поскольку вы, очевидно, не хотите a string, не читайте его. Вместо этого считайте файл как двоичные данные.

11 голосов
/ 07 мая 2012

// преобразование строки в байтовый массив

public static byte[] StrToByteArray(string str)
{
    System.Text.UTF8Encoding  encoding=new System.Text.UTF8Encoding();
    return encoding.GetBytes(str);
}

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

public string ByteArrayToStr(byte [] dBytes)
{
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
return enc.GetString(dBytes);
}
4 голосов
/ 12 февраля 2009

Используйте BinaryReader .

3 голосов
/ 12 февраля 2009

Зачем конвертировать из строки вообще? Не могли бы вы просто прочитать содержимое файла непосредственно в байтах?

byte[] fileC = File.ReadAllBytes(dialog.FileName);
1 голос
/ 12 февраля 2009

Если вы хотите байтов, используйте поток!

С какой стати вы связываетесь с TextReader?

EDIT:

Согласно вашему примеру, вы открываете файл, поэтому просто используйте FileStream.

...