Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2012, 18:53   #1
Bubel
Пользователь
 
Регистрация: 22.10.2011
Сообщений: 12
По умолчанию Вычисление CRC

Код:
using System;

using System.Text;

namespace CRC32

{

class CRCTools

{
    static void Main(string[] args)
    {
        // Читаем файл test.txt
        System.IO.FileStream stream1 = System.IO.File.OpenRead("test.txt");

        Console.WriteLine(string.Format("{0:X}", CalculateCRC(stream1)));

        Console.ReadLine();
    }

    /// <summary>
    /// Вычисление CRC32
    /// </summary>
    /// <param name="stream"></param>
    /// <returns></returns>
    public static uint CalculateCRC(System.IO.Stream stream) 
    { 
        const int buffer_size = 1024; 
        const uint POLYNOMIAL = 0xEDB88320;

        uint result = 0xFFFFFFFF; 
        uint Crc32;

        byte[] buffer = new byte[buffer_size]; 
        uint[] table_CRC32 = new uint[256];

        unchecked 
        { 
            //
            // Инициалиазация таблицы
            //
            for (int i = 0; i < 256; i++) 
            { 
                Crc32 = (uint)i;

                for (int j = 8; j > 0; j--) 
                { 
                    if ((Crc32 & 1)==1) 
                        Crc32 = (Crc32 >> 1) ^ POLYNOMIAL; 
                    else 
                        Crc32 >>= 1; 
                }

                table_CRC32[i] = Crc32; 
            }

            //
            // Чтение из буфера
            //
            int count = stream.Read(buffer, 0, buffer_size);

            //
            // Вычисление CRC
            //
            while (count > 0)  
            { 
                for (int i = 0; i < count; i++) 
                { 
                    result = ((result) >> 8) 
                        ^ table_CRC32[(buffer[i]) 
                        ^ ((result) & 0x000000FF)]; 
                }

                count = stream.Read(buffer, 0, buffer_size); 
            } 
        }

        return ~result; 
    }

}

}
Есть код для вычисления CRC32(работает правильно). Объясните пожалуйста для чего нужна table_CRC32
Bubel вне форума Ответить с цитированием
Старый 20.02.2012, 21:28   #2
Newbabe
Чиверс
Пользователь
 
Аватар для Newbabe
 
Регистрация: 07.04.2011
Сообщений: 55
По умолчанию

Эта таблица позволяет значительно ускорить расчёт CRC заменой восьми операций сдвига одной операцией поиска по таблице.Всего значений в таблице 256. Поэтому при ее расчёте выполняется цикл по 256 значениям (от 0 до 255):
Деятельность единственный путь к познаниям
Newbabe вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычисление CRC Bubel C# (си шарп) 17 18.03.2015 23:21
вычисление значения функции и переменных, вычисление площади треугольника, определение расстояния между точками на турбо паскале _4Alex4_ Помощь студентам 2 14.12.2011 01:43
CRC файла. maxflint Win Api 2 04.05.2011 12:09
Подсчет CRC newcooller Помощь студентам 0 08.11.2010 15:58
CRC ОШИБКА mikki1130 Софт 0 26.11.2009 18:42