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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2021, 22:42   #11
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Они отличаются только начальным значением (Спецификации алгоритмов CRC).
BDA, а можно изменить уже имеющуюся мою функцию? что изменить , если можно в примере?
Спасибо !

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

Ну вот где result инициализируется, это и есть начальное значение для расчета (или Init из таблицы на Википедии).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.11.2021, 23:50   #13
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Ну вот где result инициализируется, это и есть начальное значение для расчета (или Init из таблицы на Википедии).

Вы имеете ввиду за мерить 0 , на $FFFF ?

Result := 0; это CRC-16/XMODEM
Result := $FFFF; это CRC-16 CCITT судя по таблице.
Я правильно понял?
sergey.serg-72 вне форума Ответить с цитированием
Старый 11.11.2021, 00:16   #14
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Я правильно понял?
Да.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.11.2021, 00:19   #15
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Ну вот где result инициализируется, это и есть начальное значение для расчета (или Init из таблицы на Википедии).
BDA ВЫ, гений ! действительно всё получилось, взял , сделал тестовый файл -2, в редакторе HxD, подсчитал, получилось : 26Ff, изменил данные, согласно таблицы и действительно всё отлично !
Получается что CRC-16/XMODEM отличается от CRC-16 CCITT входными данными.
Действительно просто.
Вот вторая с тестовым файлом -2.

Цитата:
Сообщение от BDA Посмотреть сообщение
Да.
Разобрался , огромное спасибо BDA !
Странно то , что не в HxD, не в редакторе Тритона нет алгоритма CRC-16/XMODEM, да и я, не скажи Вы ,не знал о таком.
Получается что отработали сразу 2 варианта CRC-16/XMODEM и CRC-16 CCITT ?
Вложения
Тип файла: rar CRC-16 CCITT.rar (171.5 Кб, 2 просмотров)
Тип файла: rar тест - 2.rar (180 байт, 3 просмотров)

Последний раз редактировалось BDA; 19.11.2021 в 18:46.
sergey.serg-72 вне форума Ответить с цитированием
Старый 11.11.2021, 01:12   #16
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
не в HxD, не в редакторе Тритона нет алгоритма CRC-16/XMODEM
Может быть он менее распространен. Не знаю, что там в Тритоне, но в HxD можно нажать кнопку "Задать CRC..." и просто задать нужные параметры расчета (взяв их, например, с Википедии).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.11.2021, 03:45   #17
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Может быть он менее распространен. Не знаю, что там в Тритоне, но в HxD можно нажать кнопку "Задать CRC..." и просто задать нужные параметры расчета (взяв их, например, с Википедии).
Спасибо BDA ! я уже попробовал в HxD, да действительно. И ссылка Ваша очень к стате.
Ещё раз, огромно спасибо за помощь !
sergey.serg-72 вне форума Ответить с цитированием
Старый 11.11.2021, 18:27   #18
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Может быть он менее распространен. Не знаю, что там в Тритоне, но в HxD можно нажать кнопку "Задать CRC..." и просто задать нужные параметры расчета (взяв их, например, с Википедии).
Всем здравствуйте ! тему не закрываю, а придётся продолжить. Препод согласился с тем что это :CRC-16/XMODEM, но признавать ошибки не любит... В общем усложнил задание.
Что теперь требуется ?
1) Пересчитать контрольную сумму файла алгоритмом CRC-16/XMODEM , но не просто пересчитать.
Теперь требует пересчитать файл, пропустив( не учитывая) одного байта в файле , это байт 0Е, находящийся на адресе :02С. Полученную контрольную сумму прописать в конец файла.

То есть, надо как то пропускать один байт (не учитывать), встал в ступор !
Фото и тест-3 прилагается.

Уважаемые админы, а можно продолжить эту тему, или надо новую открывать, а эту , уже закрыли?
Изображения
Тип файла: jpg 1.JPG (38.7 Кб, 18 просмотров)
Вложения
Тип файла: rar Тест -3.rar (177 байт, 1 просмотров)

Последний раз редактировалось sergey.serg-72; 11.11.2021 в 18:37. Причина: добавить
sergey.serg-72 вне форума Ответить с цитированием
Старый 11.11.2021, 19:12   #19
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Можно пойти разными путями. Или "готовить" входные данные, исключая ненужный байт, или засунуть логику пропуска прямо в функцию подсчета (топорно, зато меньше думать):
Код:
for i := 0 to Len - 1 do
begin
  if i = $2C then
    continue;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.11.2021, 19:45   #20
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
for i := 0 to Len - 1 do
begin
if i = $2C then
continue;
Попробовал пересчитать по двум адресам, а потом сложить содержание 2 буферов.
Выходит сумма, но я не уверен , что правильная. Наверное сложение делать нельзя.

Код:
function CRC16CCITT(P: PChar; Len: Word): Word;
var
i, j: Integer;
begin
Result :=0;
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;
procedure TForm1.Button1Click(Sender: TObject);
const Adr=$02b-$0;  Adr2=$02D-$05E;
Var
crc,W: Word;
Buffer,Damp,F: 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);
Fs.Position:=$05E;
Fs.Read(w,2);
w:=swap(w );
edit4.Text:=IntToHex(w,2);
 end;
begin
Fs.Position:=$0;
SetLength(Buffer, Adr);
Fs.Read(Buffer[1],Adr);
end;
 begin
Fs.Position:=$02D;
SetLength(Damp, Adr2);
Fs.Read(Damp[1],Adr2);
F:=(Buffer+ Damp);
crc :=CRC16CCITT(PChar(f),Length(f));
//crc:=swap(crc );
edit2.Text :=IntToHex(crc, 2);
Fs.free;
end;
end;
end;
end.
sergey.serg-72 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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