Скорее всего вам покажется , что он не читает последний блок.Предположим, у вас есть файл длиной 102. Первая итерация вашего цикла читает первые 100 байтов, все в порядке.Но что происходит на втором (последнем)?Вы читаете два байта в read_buff
, который имеет длину 100. Теперь этот буфер содержит 2 байта последнего блока и 98 байтов предыдущего (первого) блока, потому что Read
не очищает буфер.Затем вы продолжаете:
foreach (byte b in read_buff)
{
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
}
В результате sb
имеет 100 байтов первого блока, 2 байта последнего блока, а затем снова 98 байтов первого блока.Если вы не присмотритесь, может показаться, что он только что пропустил последний блок, хотя в действительности он дублировал часть предыдущего.
Чтобы исправить, используйте count
(указывая, сколько байтов было на самом делечтение в буфер) для работы только с действительной частью read_buff
:
for (int i = 0; i < count; i++) {
sb.Append(Convert.ToString(read_buff[i], 16).PadLeft(2, '0'));
}