Я бы предложил просто выяснить, как долго строка будет действительно :
int firstFF = Array.IndexOf(buffer, (byte) 0xff, 192);
if (firstFF == -1)
{
firstFF = buffer.Length;
}
stringToRead = Encoding.ASCII(buffer, 192, firstFF - 192);
Я бы не попытался бы выдать Encoding.ASCII
байтов, которые нетневерный ASCII-кодированный текст.Я не знаю от руки , что это будет с ними делать, - я подозреваю, что он конвертирует их в ?
, чтобы показать ошибку (как предполагает ваш существующий вывод), но тогда вы не сможетесказать разницу между этим и реальными вопросительными знаками.Например:
byte[] data = { 0x41, 0x42, 0x43, 0xff, 0xff };
string text = Encoding.ASCII.GetString(data);
Console.WriteLine(text.Contains((char) 0xff)); // False
Console.WriteLine(text.TrimEnd((char) 0xff).Length); // Still 5...
Теперь вы могли бы создать кодировку, в которой использовался какой-нибудь символ замены, отличный от ASCII ... но это очень хлопотно, когда вы можете просто найти, где находится двоичные данные перестают быть действительными.