Стиль применения (?) операторов
От: Shmj Ниоткуда  
Дата: 24.12.16 07:02
Оценка:
Вот две функции, которые пропускают пустые (нулевые) байты потока с ускорением для потоков, для которых можно менять позицию (для таких потоков проверяем не по одному байту, а считываем в буффер и уже работаем с этим буффером).

Стиль 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;
}


Если не придираться к мелочам (как то значение буффера не в виде константы и пр.), то какой стиль написания вам кажется более понятным? Есть ли названия для каждого из таких стилей, к примеру первый это английский стиль кодирования а второй бельгийский ?

И еще вопрос. Можно ли из первого стиля в автоматическом режиме создать второй стиль и наоборот?
Отредактировано 24.12.2016 7:03 Shmj . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.