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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2021, 22:08   #1
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию Дельфи 7 Не получается реализация CRC16, на простом задание завис.

Здравствуйте ! есть задание написать программу, для подсчёта и проверки контрольной суммы, в тестовом файле по алгоритму :CRC16CCITT, именно по этому алгоритму и желательно без таблицы.
В редакторе сумма считается отлично, но в моей программе, не получается.
Контрольная сумма подсчитывается явно не так, как хотелось бы и не совпадает.
Должна быть :92BE, а у меня EA8C.

Нашёл материал, вроде сделал, всё по прочитанному, но подсчитывает неправильно.
Прошу помощи !

Код:
 {$R *.dfm}
function CRC16CCITT(P: PChar; Len: Word): Word;
var
i,j : Integer;
begin
Result:=Len;
for i:=1 to Length(P) do begin
Result:=Result xor (ord(P[i]) shl 8);
for j:=0 to 7 do begin
if (Result and $8000)<>0 then Result:=(Result shl 1) xor  Len
else Result:=Result shl 1;
end;
end;
Result:=Result and $ffff;
end;


procedure TForm1.SpeedButton2Click(Sender: TObject);
const Adr=$05E-$0;
Var
crc,W: Word;
Buffer: String;
fs: TFileStream;
Begin
edit2.Clear;
edit4.Clear;
edit5.Clear;
OpenDialog1.Filter:='BIN (*.bin)|*.bin';
with OpenDialog1 do
if Execute then
begin
fs:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
edit5.Text:=ExtractFileName(OpenDialog1.FileName);
Fs.Position:=$05E;
Fs.Read(w,2);
w:=swap(w );
edit4.Text:=IntToHex(w,2);

Fs.Position:=$0;
SetLength(Buffer, Adr);
Fs.Read(Buffer[1],Adr);
crc := CRC16CCITT(PChar(Buffer),Length(Buffer));
crc:=swap(crc );
edit2.Text :=IntToHex(crc, 2);
Fs.free;
end;
end;
Вложения
Тип файла: rar test.rar (168 байт, 2 просмотров)

Последний раз редактировалось sergey.serg-72; 09.11.2021 в 23:16.
sergey.serg-72 вне форума Ответить с цитированием
Старый 10.11.2021, 12:20   #2
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

1. Начальное значение обычно берут 0xffff
2. На шаге
Код:
for j:=0 to 7 do begin
xor идет с полиномом, а не размером. Для CRC16CCITT нормальный полином 0x1021.
ForenLi вне форума Ответить с цитированием
Старый 10.11.2021, 19:54   #3
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от ForenLi Посмотреть сообщение
Начальное значение обычно берут 0xffff
2. На шаге
Код:
Не понял я что то , а разве у меня не
Код:
Result:=Result xor (ord(P[i]) shl 8);
for j:=0 to 7 do begin
А полином Вы имеете ввиду так :
Код:
if (Result and $1021)<>0 then Result:=(Result shl 1) xor  Len
Полином я менял, всё ровно не правильный подсчёт выдаёт.

Я наверное что то не понял из вашей подсказке.
А можете на моём коде, показать где исправить, чтоб наглядней было, а то что то я не до понимаю. Заранее Спасибо !
sergey.serg-72 вне форума Ответить с цитированием
Старый 10.11.2021, 20:09   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Вбил ваш bin на сайте https://crccalc.com/. Контрольную сумму 0x92BE выдал CRC-16/XMODEM, который отличается от CCITT начальным значением.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.11.2021, 20:49   #5
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Вбил ваш bin на сайте https://crccalc.com/. Контрольную сумму 0x92BE выдал CRC-16/XMODEM, который отличается от CCITT начальным значением.
Да, может быть такое, но в двух редакторах идёт как CRC-16 CCITT, у меня два редактора, на редакторе HxD, сумма не сходится, зато на редакторе преподавателя, не помню, уточню он импортный редактор и на редакторе Тритона идёт именно как CRC-16 CCITT. И задание дано как CRC-16 CCITT,. Видимо на каждом редакторе свои алгоритмы и названия.
Изображения
Тип файла: jpg 1.JPG (40.3 Кб, 40 просмотров)
sergey.serg-72 вне форума Ответить с цитированием
Старый 10.11.2021, 21:06   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код:
function CRC16CCITT(P: PChar; Len: Word): Word;
var
  i, j: Integer;
begin
  Result := $FFFF;
  for i := 0 to Len - 1 do
  begin
    Result := Result xor (ord(P[i]) shl 8);
    for j := 0 to 7 do
    begin
      if (Result and $8000) <> 0 then
        Result := (Result shl 1) xor $1021
      else
        Result := Result shl 1;
    end;
  end;
end;
На файле не проверял, но для строки "123456789" выдал правильную контрольную сумму.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.11.2021, 21:29   #7
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
function CRC16CCITT(P: PChar; Len: Word): Word;
var
i, j: Integer;
begin
Result := $FFFF;
for i := 0 to Len - 1 do
begin
Result := Result xor (ord(P[i]) shl 8);
for j := 0 to 7 do
begin
if (Result and $8000) <> 0 then
Result := (Result shl 1) xor $1021
else
Result := Result shl 1;
end;
end;
end;
Ошибка !

Файл полностью неправильно подсчитывает заданная : 92BE, а выводит после подсчёта :FF26.
Что то неправильно в функции явно.

Последний раз редактировалось sergey.serg-72; 10.11.2021 в 21:36. Причина: добавить
sergey.serg-72 вне форума Ответить с цитированием
Старый 10.11.2021, 21:55   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Что то неправильно в функции явно.
Инициализируйте "Result := 0;" и не делайте "crc := swap(crc);". Но такое начальное значение соответствует CRC-16/XMODEM, а не CRC-16/CCITT-FALSE. В HxD, кстати, сумма 26FF.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.11.2021, 22:32   #9
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Инициализируйте "Result := 0;" и не делайте "crc := swap(crc);". Но такое начальное значение соответствует CRC-16/XMODEM, а не CRC-16/CCITT-FALSE. В HxD, кстати, сумма 26FF.
BDA , огромное спасибо ! теперь всё корректно и отлично !
Проблема была в 3 строчках
1) Result:=0; , а не полином
2)for i:=0 to Len -1 do begin цикл
3)if (Result and $8000)<>0 then Result:=(Result shl 1) xor $1021 добавлен полином 1021
Значит в интернете пример неправильный был.

Сейчас позвонил сокурснику , сказал что это алгоритм CRC-16/XMODEM, а не CRC-16/CCITT.
Что непонятка выходит... Он подтвердил что именно CRC-16/CCITT., в его редакторе тоже так идёт. BDA , если Вам не трудно, покажите как реализовать CRC16/CCITT, как правильно этот алгоритм сделать. Если вдруг преподаватель даст опять, чтоб быть готовым.
Там большая разница между CRC-16/XMODEM, и CRC-16/CCITT ? можно из моего кода сделать CRC16/CCITT .За ранее огромное спасибо !

Вот что получилось.
Вложения
Тип файла: rar CRC-16XMODEM.rar (171.4 Кб, 1 просмотров)
Тип файла: rar test.rar (168 байт, 1 просмотров)

Последний раз редактировалось sergey.serg-72; 10.11.2021 в 22:35.
sergey.serg-72 вне форума Ответить с цитированием
Старый 10.11.2021, 22:39   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Там большая разница между CRC-16/XMODEM, и CRC-16/CCITT ?
Они отличаются только начальным значением (Спецификации алгоритмов CRC).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Opendialog завис DimOn4Ik Общие вопросы Delphi 12 02.11.2018 16:08
Реализация суммы в простом варианте. Mariolka PHP 8 10.11.2016 15:50
С++ сортировка в текстовом файле. (Задание на курсовик никак не получается) Evg888 Помощь студентам 1 02.06.2012 19:37
Житейская задачка о простом копировании mephist Помощь студентам 11 16.05.2009 20:42