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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2014, 16:02   #1
web2k
 
Регистрация: 02.06.2010
Сообщений: 7
По умолчанию Помогите преобразовать код на C++ в Delphi

Столкнулся с проблемой никак не могу разобраться с кодом на C++, а сам пользуюсь Delphi и соответственно этот код нужно преобразовать в код Delphi.

Код:
unsigned char OWI_ComputeCRC8(unsigned char inData, unsigned char seed)
{
unsigned char bitsLeft;
unsigned char temp;
for (bitsLeft = 8; bitsLeft > 0; bitsLeft--)
{ temp = ((seed ^ inData) & 0x01);
if (temp == 0)
{
seed >>= 1;
}
else
{
seed ^= 0x18;
seed >>= 1;
seed |= 0x80;
}
inData >>= 1;
}
return seed;
}
Если кто-нибудь может помочь, буду благодарен!
web2k вне форума Ответить с цитированием
Старый 03.09.2014, 16:11   #2
blackstrip
Форумчанин
 
Аватар для blackstrip
 
Регистрация: 21.01.2012
Сообщений: 240
По умолчанию

А в чем затруднения?

0x?? это 16-ричные числа.
что-нибудь и "равно" - это оператор "сделать операцию, потом приравнять". Например, a+=b это a = a + b.

^ это xor
>> это shr
| это or
for (bitsLeft = 8; bitsLeft > 0; bitsLeft--) это "for bitsLeft := 8 downto 1 do"

Вот статья хорошая про это https://ru.wikipedia.org/wiki/Операторы_в_C_и_C%2B%2B
blackstrip вне форума Ответить с цитированием
Старый 03.09.2014, 16:44   #3
web2k
 
Регистрация: 02.06.2010
Сообщений: 7
По умолчанию

Спасибо за разбор полета!
Возникает еще очень интересный вопрос, который меня поставил в тупик вот вы пишете, что они перебирают данные полученного байта по битам с конца, я правильно Вас понял?
И насколько я понимаю на входе в функцию поступает один байт и разбирается по битам?
Не могли бы описать как правильно понять заголовок функции данные на входе, данные на выходе:
Код:
unsigned char OWI_ComputeCRC8(unsigned char inData, unsigned char seed)
Благодарю за толковую ссылку!
web2k вне форума Ответить с цитированием
Старый 03.09.2014, 17:18   #4
blackstrip
Форумчанин
 
Аватар для blackstrip
 
Регистрация: 21.01.2012
Сообщений: 240
По умолчанию

char - 8-битный тип
unsigned char - это 8-битное число без знака, значит от 0 до 255.
В дельфи аналог (из хелпа): Byte 0..255 unsigned 8-bit.
Получается заголовок вроде такого:
Код:
function OWI_ComputeCRC8(inData, seed:byte):byte;
bitsLeft нигде в функции не используется, можно и от 1 до 8 вместо от 8 до 1 написать, не изменится ничего.

В этой функции берется XOR между входным байтом и seed-байтом, затем отрывается последний бит (самый правый).

Если он равен нулю - то новый seed высчитывается сдвигом на разряд вправо старого seed (делением на 2). А если он не равен нулю - то высчитывается новый seed из старого как ((seed XOR $18) shr 1) or $80.

После этого входной байт данных сдвигается вправо на 1 бит (делится на два). И вся эта мутотень повторяется 8 раз, т.е. для каждого бита из байта данных. От самого младшего бита до самого старшего.

Вот еще ссылка про CRC: https://ru.wikipedia.org/wiki/Циклич...избыточный_код
blackstrip вне форума Ответить с цитированием
Старый 03.09.2014, 17:20   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Byte вместо unsigned char. Первый - возвращаемый тип, следующие два тип аргументов.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.09.2014, 19:28   #6
web2k
 
Регистрация: 02.06.2010
Сообщений: 7
По умолчанию

Большое спасибо за такие подробные и исчерпывающие ответы!
Если Вас не затруднит, да и может быть кому то пригодится код вычисления CRC-8 на дельфи, выкладываю то, что у меня получилось...
Возможно где-то ошибся...
Громко не смейтесь Почему-то мой расчет и расчет на калькуляторе CRC8 не совпадают, но может это моя ошибка или алгоритм подсчета все-таки отличается от оригинальной CRC8 (http://smbus.org/faq/crc8Applet.htm).

Код:
function ComputeCRC8(inData, seed:byte):byte;
var
bitsLeft : Integer;
temp : byte;
begin
  for bitsLeft := 1 to 8 do
    begin
      temp := ((seed xor inData) and (7));
      if temp = 0 then
        seed := seed shr 1
        else
          begin
            seed := ((seed XOR $18) shr 1) or $80;
          end;
       inData := inData shr 1;
    end;
    Result := seed;
end;
web2k вне форума Ответить с цитированием
Старый 03.09.2014, 19:53   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
temp := ((seed xor inData) and (7));
7 из виртуального кода?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.09.2014, 20:24   #8
web2k
 
Регистрация: 02.06.2010
Сообщений: 7
По умолчанию

Насколько я понял код С и описание данной процедуры Blackstripom
Код:
temp = ((seed ^ inData) & 0x01)
Цитата:
В этой функции берется XOR между входным байтом и seed-байтом, затем отрывается последний бит (самый правый).
Я не сильно разбираюсь в работе с битами в Delphi, по-этому и прошу Вашей помощи.
Поясните что я не так сделал?
Спасибо!
web2k вне форума Ответить с цитированием
Старый 03.09.2014, 22:59   #9
blackstrip
Форумчанин
 
Аватар для blackstrip
 
Регистрация: 21.01.2012
Сообщений: 240
По умолчанию

Как в десятичных числах - правый бит это младший разряд (100 - 1 сотня, 0 десятков, 0 единиц), так и в шестнадцатиричных тоже правый это младший разряд.

Так что там надо "and 1", это обнулит остальные биты и оставит только последний бит (самый правый, самый младший).

xxxxxxxxx
and
00000001
=
0000000x

А если бы надо было достать самый старший, то это было бы "and 128" (да и потом бы пришлось дополнительно делать еще сдвиг вправо shr на 7 разрядов).

xxxxxxxxx
and
10000000 (128)
=
x0000000

А если поставить "and 7" - то будет что-то страшное (останутся три последних бита от числа):
xxxxxxxxx
and
00000111 (7)
=
00000xxx

Так что поправьте на
Код:
temp := ((seed xor inData) and 1);
blackstrip вне форума Ответить с цитированием
Старый 03.09.2014, 23:39   #10
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от web2k Посмотреть сообщение
Большое спасибо за такие подробные и исчерпывающие ответы!
Если Вас не затруднит, да и может быть кому то пригодится код вычисления CRC-8 на дельфи, выкладываю то, что у меня получилось...
Возможно где-то ошибся...
Громко не смейтесь Почему-то мой расчет и расчет на калькуляторе CRC8 не совпадают, но может это моя ошибка или алгоритм подсчета все-таки отличается от оригинальной CRC8 (http://smbus.org/faq/crc8Applet.htm).

Код:
function ComputeCRC8(inData, seed:byte):byte;
var
bitsLeft : Integer;
temp : byte;
begin
  for bitsLeft := 1 to 8 do
    begin
      temp := ((seed xor inData) and (7));
      if temp = 0 then
        seed := seed shr 1
        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;
Плюс к вышесказанному ещё одна ошибка тут. Устанавливать старший бит после сдвига вправо нужно только тогда, когда до сдвига младший бит был равен 1.
Ну и для проверки младшего бита вовсе не нужна конструкция типа
Код:
(seed xor inData) and 1
. В Дельфи есть чудесные функции Odd и Even

Последний раз редактировалось northener; 03.09.2014 в 23:52.
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