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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2014, 09:49   #11
web2k
 
Регистрация: 02.06.2010
Сообщений: 7
По умолчанию

С первой строкой все понял, спасибо большое за разъяснения, но не очень понимаю в чем вторая ошибка в
Код:
        temp := ((seed xor inData) and (1)); //сделали xor и взяли младший бит
        if temp = 0 then // если младший бит равен 0 то
        seed := seed shr 1 //сдвигаем вправо на 1
        else //если младший бит не равен 0 т.е. 1
          begin
            seed := ((seed XOR $18) shr 1) or $80; //делаем xor сдвигаем вправо на 1 и берем старший бит
          end
Может я что-то не так понял из конструкции на Cи, но насколько я понимаю в конструкции if {} else {} - скобки это паскальные begin...end
В оригинальном коде:
Код:
if (temp == 0) // если
{ //begin
seed >>= 1;
} //end
else //если  не
{ //begin
seed ^= 0x18; //xor $18
seed >>= 1; //shr 1
seed |= 0x80; // or $80
} // end
Так что для меня последние три команды выполняются в любом случае соответственно XOR -> SHR 1 -> or 80
Насколько я понимаю где-то так. В чем я не прав?
web2k вне форума Ответить с цитированием
Старый 04.09.2014, 19:40   #12
web2k
 
Регистрация: 02.06.2010
Сообщений: 7
По умолчанию

Спасибо всем за участие в обсуждении и помощь! Вопрос решен, алгоритм работает замечательно, контроллер для которого высчитывается CRC отправляемых команд все воспринял!
Спасибо!
Финальный код:

Код:
function ComputeCRC8(inData, seed:byte):byte;
var
bitsLeft : Integer;
temp : byte;
begin
  for bitsLeft := 1 to 8 do
    begin
      temp := (seed xor inData) and 1;
      if temp = 0 then
      begin
        seed := seed shr 1;
      end
        else
          begin
            seed := ((seed XOR $18) shr 1) or $80;
          end;
       inData := inData shr 1;
    end;
    Result := seed;
end;
web2k вне форума Ответить с цитированием
Старый 05.09.2014, 02:49   #13
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от web2k Посмотреть сообщение
Спасибо всем за участие в обсуждении и помощь! Вопрос решен, алгоритм работает замечательно, контроллер для которого высчитывается CRC отправляемых команд все воспринял!
Спасибо!
Финальный код:

Код:
function ComputeCRC8(inData, seed:byte):byte;
var
bitsLeft : Integer;
temp : byte;
begin
  for bitsLeft := 1 to 8 do
    begin
      temp := (seed xor inData) and 1;
      if temp = 0 then
      begin
        seed := seed shr 1;
      end
        else
          begin
            seed := ((seed XOR $18) shr 1) or $80;
          end;
       inData := inData shr 1;
    end;
    Result := seed;
end;
Не верю что сей код работает правильно.
Строка seed := ((seed XOR $18) shr 1) or $80; должна по стандарту выполнять циклический сдвиг вправо, а она делает чушь.
Вот мой собственный код CRC8 переведенный с ассемблера в 90-х годах прошлого столетия:
Код:
  function GetCRC(CRC, Nextbyte: byte): byte;
  var
    i : Byte;
  begin
    for i:=0 to 7 do begin
      if Odd(CRC xor Nextbyte) then begin
        CRC:=CRC xor $18;
        CRC:=(CRC shr 1) or $80;
      end else CRC:=CRC shr 1;
      if Odd(Nextbyte) then begin
        Nextbyte:=(Nextbyte shr 1) or $80;
      end else Nextbyte:=Nextbyte shr 1;
    end;
    Result:=CRC;
  end;
Проверь его.
northener вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразовать код с C++ в Delphi harryp Помощь студентам 5 24.11.2010 17:04
преобразовать в код С++ daniil2010 Помощь студентам 2 22.04.2010 15:33
Преобразовать код... CodeExpert Помощь студентам 3 09.11.2009 16:00
Как преобразовать код SeRhy HTML и CSS 1 17.08.2008 15:50
преобразовать Delphi код в assembler rip Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 12.05.2008 15:46