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

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

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

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

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

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

Цитата:
Сообщение от BDA Посмотреть сообщение
В result 15 битное число, поэтому для проверки старшего бита новая маска 4000. И перед возвратом из функции в result 16-й бит обнуляется.
15 бит ,это 1,88 байт, 16 бит - 2 байта, 12 бит -1,5 байта, 8 бит - 1 байт ,10 бит - 1,25 байт это понятно. А как маска вычисляется, для 8 , 10,12,13 ? и соответственно обнуление .

Цитата:
Сообщение от BDA Посмотреть сообщение
Вбил ваш bin на сайте https://crccalc.com/. Контрольную сумму 0x92BE выдал CRC-16/XMODEM, который отличается от CCITT начальным значением.
И ни как не могу разобраться как Вы вбиваете bin файл. нет кнопки загрузки файла.
И как вы отличили какая CRC ? ни как не могу тестовый файл загнать.

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
А как маска вычисляется, для 8 , 10,12,13 ? и соответственно обнуление .
Для длины 15:
0x4000 это 0100 0000 0000 0000‬ в двоичном виде (15й бит единичка, а остальные нули).
0x7FFF это 0111 1111 1111 1111‬ в двоичном виде (пятнадцать единичек).
Для других длин аналогично поступать. Проблема сейчас возникнет с длинами меньше 8 - их как-то по-другому нужно учесть.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
ни как не могу разобраться как Вы вбиваете bin файл
Открыл файл в HxD, выделил нужный кусок (целиком, например), скопировал его (можно Ctrl+C), вставил в блокнот, удалил все пробелы, вставил в поле на сайте, Input type выбрал HEX, нажал "Calc CRC-16".
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
И как вы отличили какая CRC ?
А потом искал в столбце Result контрольную сумму, которая совпадала бы с той, что записана в файле.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 17.11.2021, 04:20   #73
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Для длины 15:
0x4000 это 0100 0000 0000 0000‬ в двоичном виде (15й бит единичка, а остальные нули).
0x7FFF это 0111 1111 1111 1111‬ в двоичном виде (пятнадцать единичек).
Для других длин аналогично поступать. Проблема сейчас возникнет с длинами меньше 8 - их как-то по-другому нужно учесть.
С этим разобрался вот : lдля длины 8

0X100 это 0100000000
0xFF это 011111111


для длины 10

0 X200 это 010000000000


0xFF это 01111111111



для длины 12

0X 800 это 0100000000000

0xFFF это 0111111111111

Не знаю как с функцией reverse - скорей всего не подойдёт, надо менять.

А вот CRC8 сделал так :
Код:
 function CRC8 (P: PChar; Len: Word; skip_i: Integer; Poly, Init, XorOut: Word; RefIn, RefOut: Boolean): Word;
var
  i, j: Integer;
begin
  Result := Init;
  for i := 0 to Len - 1 do
  begin
    if i = skip_i then
      Continue;
    if RefIn then
      Result := Result xor (reverse(ord(P[i])) shr 1)
    else
      Result := Result xor (ord(P[i]) shl 8);
    for j := 0 to 8 do
    begin
      if (Result and $100) <> 0 then
        Result := (Result shl 1) xor Poly
      else
        Result := Result shl 1;
    end;
  end;
  if RefOut then
    Result := reverse(Result) shr 1;
  Result := Result xor XorOut;
  Result := Result and $FF;
end;


function CRC8DARC(P: PChar; Len: Word; skip_: Integer): Word;
begin
  Result := CRC8(P, Len, skip_ ,  $38, 0, 0, true, true);
end;

crc := CRC8DARC(PChar(buffer), buf_len, skip_ - addr1);
Остаётся функция reverse для каких подойдёт и как исправить?
sergey.serg-72 вне форума Ответить с цитированием
Старый 17.11.2021, 04:37   #74
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
С этим разобрался вот : для длины 8
0X100 это 0100000000
0xFF это 011111111
Я неверно сказал для длины 15. Если нумеровать биты с нуля, то 14й бит единичка. Поэтому для длины 8: 0x80 и 0xFF.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Не знаю как с функцией reverse - скорей всего не подойдёт, надо менять.
Не надо её менять. Но для CRC8 сдвиги тоже надо менять (а не только менять маски):
Код:
function CRC8(P: PChar; Len: Word; skip_i: Integer; Poly, Init, XorOut: Word; RefIn, RefOut: Boolean): Word;
var
  i, j: Integer;
begin
  Result := Init;
  for i := 0 to Len - 1 do
  begin
    if i = skip_i then
      Continue;
    if RefIn then
      Result := Result xor (reverse(ord(P[i])) shr 8)
    else
      Result := Result xor ord(P[i]);
    for j := 0 to 7 do
    begin
      if (Result and $80) <> 0 then
        Result := (Result shl 1) xor Poly
      else
        Result := Result shl 1;
    end;
  end;
  if RefOut then
    Result := reverse(Result) shr 8;
  Result := Result xor XorOut;
  Result := Result and $FF;
end;
А еще у CRC-8/DARC полином 0x39, а не 0x38.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 17.11.2021, 04:41   #75
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Открыл файл в HxD, выделил нужный кусок (целиком, например), скопировал его (можно Ctrl+C), вставил в блокнот, удалил все пробелы, вставил в поле на сайте, Input type выбрал HEX, нажал "Calc CRC-16".
Сделал, скопировал, пробелы убрал. Но хорошо это маленький файл, а если большой?
неделю пробелы убирать ? Не ужели нельзя было сделать кнопку загрузки файла bin, hex,s19?....

Цитата:
Сообщение от BDA Посмотреть сообщение
А потом искал в столбце Result контрольную сумму, которая совпадала бы с той, что записана в файле.
Всё сделал , но в столбце нет контрольной суммы , которая бы совпадала 69АС, я такой не видел и не понял как отличили какая из CRC16. Всё по инструкции делал.
Вот фото.
Изображения
Тип файла: jpg 1.JPG (68.3 Кб, 0 просмотров)

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
неделю пробелы убирать ?
Ну их убирать надо не вручную, а заменой по тексту.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Но хорошо это маленький файл, а если большой?
Значит нужно искать сайт, который поддерживает загрузку файлов. Но чтобы разобраться вполне и этого хватает.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
но в столбце нет контрольной суммы , которая бы совпадала 69АС
На сайте Output type смените на HEX.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 17.11.2021, 04:58   #77
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Я неверно сказал для длины 15. Если нумеровать биты с нуля, то 14й бит единичка. Поэтому для длины 8: 0x80 и 0xFF
Да, действительно, а тоже сразу заподозрил не ладное. Всё, усвоено.

Цитата:
Сообщение от BDA Посмотреть сообщение
На сайте Output type смените на HEX.
Ура разобрался !!!

Цитата:
Сообщение от BDA Посмотреть сообщение
А еще у CRC-8/DARC полином 0x39, а не 0x38.
Я без очков, действительно 39, это сослепу.

Цитата:
Сообщение от BDA Посмотреть сообщение
Не надо её менять. Но для CRC8 сдвиги тоже надо менять (а не только менять маски):
Вот с этого момента , если можно подробней !
Как я понял , что в функции reverse, ничего менять не надо она подходит и для CRC9.10,12,14 ?


(. Но для CRC8 сдвиги тоже надо менять (а не только менять маски):[/QUOTE] Вот с этого момента не понял, сдвиги и для 8,10,12,14 разные? можно пример пожалуйста, а то не догоню ни как. Наверное опять просто, а я тормажу.
Изображения
Тип файла: jpg 2.JPG (60.7 Кб, 0 просмотров)

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
в функции reverse, ничего менять не надо она подходит
Да.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
сдвиги и для 8,10,12,14 разные?
Да.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
можно пример
Сравните код функций CRC8 и CRC15, которые выше упоминались.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 17.11.2021, 05:36   #79
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Сравните код функций CRC8 и CRC15, которые выше упоминались.
Сравнил ; Result := Result xor (ord(P[i]) shl 8);
for j := 0 to 8 do /// для CRC8



Result := Result xor (ord(P[i]) shl 7);

for j := 0 to 7 do /// для CRC15

Получается что для чётных 8 сдвиг. а для не чётных 7?
sergey.serg-72 вне форума Ответить с цитированием
Старый 17.11.2021, 05:42   #80
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Все-таки стоит сравнивать CRC8 и CRC15 из моих сообщений, а не из ваших
Цикл по j не нужно было менять. А сдвиги зависят не от четности/нечетности, а от требуемой длины.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
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