Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проверка расчета CRC16/CITT, проверка расчета контрольной суммы 
V
    Опции темы
Демидрол
Дата 22.9.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго всем времени суток. Возникла следующая проблема: есть прога,считающая контрольную сумму по алгоритму CRC16/CITT. Хотелось бы проверить,совпадает ли результат её работы с расчетами этой суммы..как-нибудь по-другому,например,ручками,на бумажке карандашиком  smile 
Вот.Просто что-то я никак не соображу,как задать какие-либо данные,чтобы знать их двоичный код и потом проверить,т.е. поделить ручками на бумажке.
Заранее спасибо,
PS работаю в билдере версии 6.
код:
Файл CRC.cpp
Код

//------------------------------------------------------------------------------
#pragma hdrstop
#include "CRC.h"

T_CRC *CRCobj;

//------------------------------------------------------------------------------
/*
  Name  : CRC-16 CCITT
  Poly  : 0x1021   x^16 + x^12 + x^5 + 1
  Init  : 0xFFFF
  Revert: false
  XorOut: 0x0000
  Check : 0x29B1 ("123456789")
  MaxLen: 4095 áàéò (32767 áèò) - îáíàðóæåíèå
    îäèíàðíûõ, äâîéíûõ, òðîéíûõ è âñåõ íå÷åòíûõ îøèáîê
*/
unsigned short T_CRC::CaleCRC16CheckSum (const unsigned char *DataBlock, const unsigned long DataBlockLen )
{
    unsigned short crc = 0xFFFF;


    while (DataBlockLen--)
    {
       crc ^= *DataBlock++ << 8;

       for (unsigned char i = 0; i < 8; i++)
          crc = crc & 0x8000 ? ( crc << 1 ) ^ 0x1021 : crc << 1;
    }

    return crc;
};


//------------------------------------------------------------------------------
#pragma package(smart_init)


файл CRC.h
Код

//---------------------------------------------------------------------------

#ifndef CRCH
#define CRCH
//---------------------------------------------------------------------------
#include <iostream.h>
#include <Classes.hpp>
#include <fstream>
#include <stdio.h>
#include <io.h>
#include<fcntl.h>

class T_CRC
{
private:
protected:
public:

//------------------------------------------------------------------------------
unsigned short CaleCRC16CheckSum(const unsigned char* DataBlock, unsigned long DataBlockLen );
//------------------------------------------------------------------------------
};

//------------------------------------------------------------------------------
#endif


PM MAIL   Вверх
mrbrooks
Дата 22.9.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



Демидрол, j, обычно контрольную сумму для определенного буфера дает производитель дивайса. 
а так - ну дык у тебя же алгоритм написан - вот и действуй.
PM MAIL   Вверх
Демидрол
Дата 22.9.2008, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



я понимаю логику как считать.И на небольших примерах могу смастерить.Только не знаю,как задать какую-нить штуку в datablock, чтобы знать,какой двоичный код ей соответствует,т.е. посчитать что-либо могу,только хочу знать что считать, т.е. какой двоичный код по алгоритму гонять. smile 

т.е. хочется получить совет,как мне узнать двоичный код комбинации,находящейся в            char *datablock,только и всего..наверное   smile 

Это сообщение отредактировал(а) Демидрол - 23.9.2008, 13:28
PM MAIL   Вверх
Демидрол
Дата 23.9.2008, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Уважаемые Знатоки,внимание,ВОПРОС:
сидел тут и разбирался с алгоритмом CRC вообще,информацию искал и накнылся в сети на информацию,что в строке  
Код

crc = crc & 0x8000 ? ( crc << 1 ) ^ 0x1021 : crc << 1;

вместо 0x8000 используется 0xA001. Верно ли это?

И еще хотелось бы спросить,потому как мыслей умных не хватает и мозга:

1) если рассчитывать данную вещь,то во многих источниках пишется,что сообщение дополняется количеством нулей,причем это количество равно степени полинома,в данном случае,16. Верно ли это?

2) степень кода выражения CRC будет равна степени полинома, используемого в алгоритме, в данном случае - 15? Я сделал тестовый пример,получил выражение, степень которого равна 14.Это ошибка или нет? В качестве теста писпользовал строку "123456789", которой соответствует комбинация 29В1. Получил 5349h. Может,я где-то напортачил? Или все правильно, просто для того,чтобы код дописать в сообщение нужно в его голову дописать несколько нулей,чтобы получилось выражение 16-й степени?

3) в данном случае речь идет о полиноме 0х1021, но это полином х12 + х5 + 1, а в теории-то должен быть полином 0х11021, который и соответствует теоритическому х16 + х12 + х5 + 1. Что с этим делать и как поступить?

Вот, почитал руками. Результат явно не совпадает с тем,что получилось в программе  smile 
10100110110001000000000000000
10001000000100001
00101110110101001000000000000
    101110110101001000000000000
    10001000000100001
    001100110100001010000000000
        1100110100001010000000000
        10001000000100001
        0100010100011010100000000
          100010100011010100000000
          10001000000100001
          000000100010010110000000
                      100010010110000000
                      10001000000100001
                      000000010111000010
                                    10111000010

а по программе должно получиться 101001101001001  smile 


Это сообщение отредактировал(а) Демидрол - 23.9.2008, 15:39
PM MAIL   Вверх
andrew_121
Дата 23.9.2008, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(Демидрол @  23.9.2008,  15:07 Найти цитируемый пост)
И еще хотелось бы спросить,потому как мыслей умных не хватает и мозга

Двусмысленно smile  smile  smile 
Для этих целей есть чтандартные утилиты. Созданые именно для этих целей. Гугл в руки.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Демидрол
Дата 24.9.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



отлично.жаль,что я так уже и поступил,качнул утилиту для расчета СКС-16.
считает,она правда,в HEX-формате и надо ей задать исходные данные имнно в этом формате.
Проблема остается неизменной:как узнать,какой код в 16-й системе или двоичной,не важно,соответствует выражению, имеющему тип char*  smile 
PM MAIL   Вверх
Демидрол
Дата 24.9.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



нашел я то,что искал,а именно какой код соответствуетт комбинациям в datablock.
Оказалось,считает прога неправильно.  smile 
Может,кто сталкивался с темой расчета CRC подскажет,как правильно рассчитывать сию вещь, потому как в сети нашел много примеров,в которых используется код,отличающийся от моего лишь названиями...Помогите,пожалуйста,а то  smile 
PM MAIL   Вверх
xvr
Дата 24.9.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Демидрол @ 23.9.2008,  15:07)
Уважаемые Знатоки,внимание,ВОПРОС:
сидел тут и разбирался с алгоритмом CRC вообще,информацию искал и накнылся в сети на информацию,что в строке  
Код

crc = crc & 0x8000 ? ( crc << 1 ) ^ 0x1021 : crc << 1;

вместо 0x8000 используется 0xA001. Верно ли это?

Нет


Цитата

И еще хотелось бы спросить,потому как мыслей умных не хватает и мозга:

1) если рассчитывать данную вещь,то во многих источниках пишется,что сообщение дополняется количеством нулей,причем это количество равно степени полинома,в данном случае,16. Верно ли это?
Нет

Цитата

2) степень кода выражения CRC будет равна степени полинома, используемого в алгоритме, в данном случае - 15? 
Нет. Она будет не больше 16 (степень полинома - 16, а не 15)

Цитата

Я сделал тестовый пример,получил выражение, степень которого равна 14.Это ошибка или нет? В качестве теста писпользовал строку "123456789", которой соответствует комбинация 29В1. 
Строке "123456789" соответствует CRC 29B1

Цитата

Получил 5349h. 
Откуда  smile 

Цитата

Может,я где-то напортачил? 
Без сомнения

Цитата

Или все правильно, просто для того,чтобы код дописать в сообщение нужно в его голову дописать несколько нулей,чтобы получилось выражение 16-й степени?
Не надо, у тебя исходная строка "123456789" уже 72 бита, куда уж больше  smile 

Цитата

3) в данном случае речь идет о полиноме 0х1021, но это полином х12 + х5 + 1, а в теории-то должен быть полином 0х11021, который и соответствует теоритическому х16 + х12 + х5 + 1. Что с этим делать и как поступить?
CRC16 подразумевает полином 16й степени, при этом x16 соотвествует 0x10000, что лежит за границей типа short (16 бит) и обрабатывается отдельно и явно условием crc&0x8000

Цитата

Вот, почитал руками. Результат явно не совпадает с тем,что получилось в программе  smile 
10100110110001000000000000000
Что то у тебя короткий входной вектор, явно не 72 бита  smile 
Вот твой вектор:
hex: 31 32 33 34 35 36 37 38 39
bin: 00110001 00110010 00110011 00110100 00110101 00110110 00110111 00111000 00111001
считай  smile 

PM MAIL   Вверх
Демидрол
Дата 26.9.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



хм,а тогда возник вопрос: если строка будет состоять например, только из одной цифры один, "1", ей соответствует 00110001, а как тогда получиться код 16-й степени?
Или операция xOr будет произведена только над старшими восемью битами полинома, а остальные допишутся как были в полиноме? Непонятно...... smile 

Кстати,посчитал для строки "123456789",получил :
001100010011001000110011001101000011010100110110001101110011100000111001
10001000000100001
101110010010001010110011001101000011010100110110001101110011100000111001
    1110010010001010110011001101000011010100110110001101110011100000111001
    10001000000100001
    0110110010011010010011001101000011010100110110001101110011100000111001
      110110010011010010011001101000011010100110110001101110011100000111001
      10001000000100001
      010100010010010000011001101000011010100110110001101110011100000111001
        10100010010010000011001101000011010100110110001101110011100000111001
        10001000000100001
        00101010010110001011001101000011010100110110001101110011100000111001
            101010010110001011001101000011010100110110001101110011100000111001
            10001000000100001
            001000010111001001001101000011010100110110001101110011100000111001
                1000010111001001001101000011010100110110001101110011100000111001
                10001000000100001
                0000110111011001101101000011010100110110001101110011100000111001
                        110111011001101101000011010100110110001101110011100000111001
                        10001000000100001
                        010101011000101111000011010100110110001101110011100000111001
                          10101011000101111000011010100110110001101110011100000111001
                          10001000000100001
                          00100011000001110000011010100110110001101110011100000111001
                              100011000001110000011010100110110001101110011100000111001
                              10001000000100001
                              000001000000110010011010100110110001101110011100000111001
                                        1000000110010011010100110110001101110011100000111001
                                        10001000000100001
                                        0000100110000011110100110110001101110011100000111001
                                                100110000011110100110110001101110011100000111001
                                                10001000000100001
                                                000100000010110110110110001101110011100000111001
                                                      100000010110110110110001101110011100000111001
                                                      10001000000100001
                                                      000010010111110100110001101110011100000111001
                                                              10010111110100110001101110011100000111001
                                                              10001000000100001
                                                              00011111110000111001101110011100000111001
                                                                    11111110000111001101110011100000111001
                                                                    10001000000100001
                                                                    01110110000011000101110011100000111001
                                                                      1110110000011000101110011100000111001
                                                                      10001000000100001
                                                                      0110010000001000001110011100000111001
                                                                        110010000001000001110011100000111001
                                                                        10001000000100001
                                                                        010000000000000011110011100000111001
                                                                          10000000000000011110011100000111001
                                                                          10001000000100001
                                                                          00001000000100010110011100000111001
                                                                                  1000000100010110011100000111001
                                                                                  10001000000100001
                                                                                  0000100100000110111100000111001
                                                                                          100100000110111100000111001
                                                                                          10001000000100001
                                                                                          000110000111111110000111001
                                                                                                110000111111110000111001
                                                                                                10001000000100001
                                                                                                010010111110110010111001
                                                                                                  10010111110110010111001
                                                                                                  10001000000100001
                                                                                                  00011111110010011111001
                                                                                                        11111110010011111001
                                                                                                        10001000000100001
                                                                                                        01110110010111110001
                                                                                                          1110110010111110001
                                                                                                          10001000000100001
                                                                                                          0110010010101110101
                                                                                                            110010010101110101
                                                                                                            10001000000100001
                                                                                                            010000010100110111
                                                                                                              10000010100110111
                                                                                                              10001000000100001
                                                                                                              00001010100010110
                                                                                                                     1010100010110

что-то это ни разу не 29В1.... smile 

Это сообщение отредактировал(а) Демидрол - 26.9.2008, 15:58
PM MAIL   Вверх
xvr
Дата 26.9.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Демидрол @ 26.9.2008,  14:00)
хм,а тогда возник вопрос: если строка будет состоять например, только из одной цифры один, "1", ей соответствует 00110001, а как тогда получиться код 16-й степени?

Если исходные данные короче 16 бит, то они будут соотвествовать полиному степени меньше 16, что не помешает поделить его на полином степени 16.

Цитата

Или операция xOr будет произведена только над старшими восемью битами полинома, а остальные допишутся как были в полиноме? Непонятно...... smile 
По идее надо дописать слева нули.

Цитата

Кстати,посчитал для строки "123456789",получил :
Увы, проверить у меня терпения не хватит  smile Советую сначала разобраться каким битам переменной crc соотвествуют какие степени полинома, и как представляется входной полином (какими битами вперед). 
Я как то этими вопросами никогда не интересовался  smile 
PM MAIL   Вверх
Демидрол
Дата 2.10.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ммм.....пардон за такой глупый вопрос,но не сталкивался ещё с этим:
как дописать в DataBlock в конец полученный код? Это нужно в файле проверки....По идее,если вычеслить CRC для модифицированного DataBlock, то долже получиться 0.
Допустим, char* DataBlock = "1".
Вызываю функцию для рассчета CRC, получаю int res. Как мне записать res в конец DataBlock?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




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


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

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