Вот пример, использующий FileReadAllBytes, для чтения в противном случае «текстового» файла, который содержит шестнадцатеричные нули 00, а также другие специальные символы.
Справочная информация. У старого движка баз данных Borland от Paradox и Delphi дней есть файл конфигурации, называемый либо IDAPI.CFG, либо IDAPI32.CFG. Файл в основном обычный текст, но также содержит символы ASCII от 0 (ноль) до 4. Мне нужно было прочитать этот файл, чтобы определить текущее значение параметра «NET DIR», и пропустить нули.
Подход:
1) Считайте файл как поток байтов, одним большим (или маленьким) глотком в байтовый массив. Важное утверждение
byte[filecontents] = File.ReadAllBytes(fileName).
2) Чтение и обработка каждого символа в байтовом массиве. Для каждого персонажа ...
* Если ноль, игнорируйте его
* Если другой выбранный символ (ASCII 01 - 04) либо игнорирует его, либо преобразует его в другой символ, представляющий его функцию, например, NewLine или знак равенства.
* Если другой (например, отображаемый) ASCII-символ, преобразуйте байт обратно в символьную форму и добавьте в выходной построитель строк. Строка кода, которая делает это: textOut.Append((char)fileByte)
private string GetBDEConfigText(string fileName)
{
StringBuilder textOut = new StringBuilder();
byte[] fileContents = File.ReadAllBytes(fileName);
foreach (byte fileByte in fileContents)
{
switch (fileByte)
{
case 0:
{
// Leave unchanged, strip out binary character
break;
}
case 1:
{
// Leave unchanged, strip out binary character
break;
}
case 2:
{
break;
}
case 3:
{
textOut.Append(Environment.NewLine);
break;
}
case 4:
{
textOut.Append('=');
break;
}
default:
{
textOut.Append((char)fileByte);
break;
}
}
}
return textOut.ToString();
}