Вот две функции, которые пропускают пустые (нулевые) байты потока с ускорением для потоков, для которых можно менять позицию (для таких потоков проверяем не по одному байту, а считываем в буффер и уже работаем с этим буффером).
Стиль 1
| Скрытый текст |
| internal static bool SkipZeroBytes(this BinaryReader binaryReader)
{
const int bufferMaxSize = 1000000;
int peekCharResult;
if (binaryReader.BaseStream.CanSeek)
{
int skipedBytes = 0;
while ((peekCharResult = binaryReader.PeekChar()) == 0 && skipedBytes < 1000)
{
binaryReader.ReadBytes(1);
skipedBytes++;
}
if (peekCharResult != 0)
{
return peekCharResult > 0;
}
bool bufferIsZeroed;
bool endOfFileReached;
do
{
long streamPosition = binaryReader.BaseStream.Position;
byte[] buffer = binaryReader.ReadBytes(bufferMaxSize);
endOfFileReached = buffer.Length < bufferMaxSize;
bufferIsZeroed = true;
for (int i = 0; i < buffer.Length; i++)
{
if (buffer[i] != 0)
{
bufferIsZeroed = false;
binaryReader.BaseStream.Seek(streamPosition + i, SeekOrigin.Begin);
break;
}
}
}
while (bufferIsZeroed && endOfFileReached == false);
return (endOfFileReached && bufferIsZeroed) == false;
}
else
{
while ((peekCharResult = binaryReader.PeekChar()) == 0)
{
binaryReader.ReadBytes(1);
}
return peekCharResult > 0;
}
}
|
| |
Стиль 2
| Скрытый текст |
| internal static bool SkipZeroBytes(this BinaryReader binaryReader)
{
var canSeek = binaryReader.BaseStream.CanSeek;
int @char;
int skipedBytes = 0;
while ((@char = binaryReader.PeekChar()) == 0)
{
binaryReader.ReadBytes(1);
skipedBytes++;
if (canSeek && skipedBytes >= 1024)
break;
}
if (@char != 0 || !canSeek)
return @char > 0;
const int maxBufferSize = 4 * 1024 * 1024;
bool nonZeroFound = false;
bool endOfFileReached;
do
{
long startPosition = binaryReader.BaseStream.Position;
byte[] buffer = binaryReader.ReadBytes(maxBufferSize);
endOfFileReached = buffer.Length < maxBufferSize;
for (int i = 0; i < buffer.Length; i++)
{
if (0 == buffer[i])
continue;
nonZeroFound = true;
binaryReader.BaseStream.Seek(startPosition + i, SeekOrigin.Begin);
break;
}
} while (!(nonZeroFound || endOfFileReached));
return nonZeroFound;
}
|
| |
Если не придираться к мелочам (как то значение буффера не в виде константы и пр.), то какой стиль написания вам кажется более понятным? Есть ли названия для каждого из таких стилей, к примеру первый это английский стиль кодирования а второй бельгийский

?
И еще вопрос. Можно ли из первого стиля в автоматическом режиме создать второй стиль и наоборот?