Я не верю, что ранее отвечавшие отвечали на вопрос. Многие люди говорят 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 является соответствующая техника.