Вопрос

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

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 - это ?.

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

Спасибо, Майкл

Это было полезно?

Решение

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

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

...

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

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

byte[] fileC = File.ReadAllBytes(dialog.FileName);

Другие советы

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

Затем используйте это:

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

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

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

//конвертируем строку в массив байтов

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);
}

Использовать БинарныйReader.

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

byte[] fileC = File.ReadAllBytes(dialog.FileName);

Если вам нужны байты, используйте Stream!

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

РЕДАКТИРОВАТЬ:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top