Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать сумму CRC данных файла, C# 
:(
    Опции темы
emmanuil
Дата 2.5.2007, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: нет
Всего: 3



Как можно подсчитать сумму CRC данных файла на C#?
PM MAIL   Вверх
Void
Дата 2.5.2007, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



Cyclic Redundancy Check бывает разный.
Вот найденная в собственных архивах реализация алгоритма CRC32 в его наиболее распространённой вариации. Если нужно проверять контрольную сумму данных, пришедших «со стороны», надо проверить, какая реализация CRC используется там. Если считать и проверять самому, то это подойдёт. Если нет очень жёстких требований к быстродействию, можно сразу использовать уже имеющиеся во фреймворке криптографические хэш-функции (MD5, SHA).
Код

using System;
using System.IO;
using System.Text;

static class CRC32
{
    private static readonly uint[] crc_table = new uint[256];
    
    public const int BufferSize = 4096;
    
    static CRC32()
    {
        for (int n = 0; n < 256; ++n)
        {
            uint c = (uint) n;
            for (int k = 0; k < 8; ++k)
                if ((c & 1) != 0)
                    c = 0xEDB88320 ^ (c >> 1);
                else
                    c >>= 1;
            crc_table[n] = c;
        }
    }
    
    public static uint Update(uint crc, byte[] data, int offset, int count)
    {
        for (int n = offset; n < offset + count; ++n)
            crc = crc_table[(crc ^ data[n]) & 0xFF] ^ (crc >> 8);
        return crc;
    }
    
    public static uint Compute(byte[] data)
    {
        return Update(0xFFFFFFFF, data, 0, data.Length) ^ 0xFFFFFFFF;
    }
    
    public static uint Compute(Stream stream)
    {
        if (stream == null)
            throw new ArgumentNullException("stream");
        byte[] buffer = new byte[BufferSize];
        int readBytes = 0;
        uint crc = 0xFFFFFFFF;
        while ((readBytes = stream.Read(buffer, 0, BufferSize)) > 0)
        {
            crc = Update(crc, buffer, 0, readBytes);
        }
        return crc ^ 0xFFFFFFFF;
    }
}

забыл финальный xor в перегрузке для Stream, fixed

Это сообщение отредактировал(а) Void - 3.5.2007, 20:57


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
emmanuil
Дата 3.5.2007, 05:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: нет
Всего: 3



Void, спасибо! А как проверить, какая реализация CRC используется?
Задача такая: Приходит файл со стороны и с ним приходит контрольная сумма данных этого файла. Нужно проверить совпадают ли они. Это также нужно для того, чтобы ктонибудь, после того как пришел файл, самостоятельно не начал его править. Ведь если изменить хоть один символ, то CRC сразу меняется. Это своего рода защита от злоумышленников, в файле приходят денежные суммы с банка.
А что за криптографические хэш-функции (MD5, SHA), где их взять, я недавно стал программировать на C# smile 
PM MAIL   Вверх
adLucem
Дата 3.5.2007, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

Репутация: 4
Всего: 5



Цитата(emmanuil @  3.5.2007,  03:27 Найти цитируемый пост)
А что за криптографические хэш-функции (MD5, SHA)

Статья о MD5 хэшах в Wikipedia

Как использовать:
Код

using System.Text;
using System.Security.Cryptography;

// Создаем объект хэшера
MD5 hasher = MD5.Create ( );
// hash - полученный MD5 хэш
// arg - хэшируемые данные (в данном случае строка, в которую может быть прочитано содержимое файла)
byte [ ] hash = hasher.ComputeHash ( Encoding.Default.GetBytes ( arg ) );
// Перекодирование хэша в символьный формат (который может использоваться для сравнения хэшей и позволяет публиковать хэши в удобочитаемом формате)
StringBuilder sBuilder = new StringBuilder ( );
foreach ( byte hashByte in hash ) {
    sBuilder.Append ( hashByte.ToString ( "X2" ) );
}

PM MAIL ICQ   Вверх
Exception
Дата 3.5.2007, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.