Как я могу преобразовать двоичный файл в набор символов ascii - PullRequest
0 голосов
/ 29 мая 2009

Я хочу преобразовать двоичный файл в массив символов ascii. Как мне это сделать . спасибо.

Ответы [ 5 ]

4 голосов
/ 29 мая 2009

Это зависит от того, что вы хотите с ним делать. Предполагается, что Ascii составляет 7 бит (0-127 четко определены, остальные символы зависят от кодовой страницы). Таким образом, простое кодирование ASCII может привести к неприятным сюрпризам (среди которых непечатаемые символы в виде нулей ...)

Если вы хотите, чтобы что-то печаталось из вашего байтового массива, вам не следует преобразовывать их в кодировке ASCII. Вам лучше закодировать его в Base64, который является безопасным (хотя и не слишком оптимальным по размеру) способом кодирования двоичного файла в строки.

Чтобы кодировать ваши байты в Base64, вы можете просто набрать:

string result = System.Convert.ToBase64String(yourByteArray);
2 голосов
/ 29 мая 2009

Проверьте BASE64 или UUEncoding. Я предполагаю, что вы хотите использовать только печатные символы из набора ASCII из 256 символов.

BASE64 использует только 64 символа (иногда это используется, например, при отправке двоичного файла по электронной почте). Это приводит к увеличению размера выходных данных, что необходимо учитывать в вашей ситуации.

1 голос
/ 29 мая 2009
StreamReader reader = new StreamReader("pathtoyourbinaryfile", System.Text.Encoding.ASCII);
char[] text = reader.ReadToEnd().ToCharArray();
0 голосов
/ 02 октября 2011

Я не верю, что ранее отвечавшие отвечали на вопрос. Многие люди говорят ASCII, когда имеют в виду байты, поэтому я подозреваю, что спрашивающий хотел прочитать двоичный файл, а не текстовый файл с закодированными символами.

Чтобы продемонстрировать влияние различных методов, я создал текстовый файл UTF-8 из следующей строки:

  string s = "\ta£\x0394\x221A";   // tab; lower case a; pound sign; Greek delta; square root  

Следующая программа читает этот файл сначала как текстовую строку, а затем как массив байтов. В каждом случае он отображает ввод сначала в десятичном виде, а затем в шестнадцатеричном.

  String test = "";
  String fileStg = File.ReadAllText("Test.txt");
  for (int i = 0; i < fileStg.Length; i++)
    test += (int)fileStg[i] + " ";
  Debug.Print(test);
  test = "";
  for (int i = 0; i < fileStg.Length; i++)
    test += ((int)fileStg[i]).ToString("X") + " ";
  Debug.Print(test);
  test = "";
  Byte[] fileByte = File.ReadAllBytes(pathProg + "Test.txt");
  for (int i = 0; i < fileByte.Length; i++)
    test += fileByte[i].ToString() + " ";
  Debug.Print(test);
  test = "";
  for (int i = 0; i < fileByte.Length; i++)
    test += fileByte[i].ToString("X") + " ";
  Debug.Print(test);

Выход:

9 97 163 916 8730 13 10
9 61 A3 394 221A D A
239 187 191 9 97 194 163 206 148 226 136 154 13 10
EF BB BF 9 61 C2 A3 CE 94 E2 88 9A D A

Обратите внимание, что при чтении в виде текстового файла спецификация удаляется, и многобайтовые символы UTF-8 становятся одиночными символами во входной строке. Но при чтении в виде массива байтов я получаю спецификацию и необработанный код UTF-8.

Я подозреваю, что спрашивающий хотел прочитать подлинный двоичный файл, а не текстовый файл Unicode, но я полагаю, что этот пример лучше иллюстрирует влияние двух методов и показывает, что если спрашивающий хочет прочитать двоичный файл, тогда ReadAllBytes является соответствующая техника.

0 голосов
/ 29 мая 2009

Вы можете прочитать каждого персонажа и просто привести его к символу. Это преобразовало бы каждый байт в символ ascii. Это то, что вы хотите сделать?

...