|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
03.09.2014, 16:02 | #1 |
Регистрация: 02.06.2010
Сообщений: 7
|
Помогите преобразовать код на C++ в Delphi
Столкнулся с проблемой никак не могу разобраться с кодом на C++, а сам пользуюсь Delphi и соответственно этот код нужно преобразовать в код Delphi.
Код:
|
03.09.2014, 16:11 | #2 |
Форумчанин
Регистрация: 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 |
03.09.2014, 16:44 | #3 |
Регистрация: 02.06.2010
Сообщений: 7
|
Спасибо за разбор полета!
Возникает еще очень интересный вопрос, который меня поставил в тупик вот вы пишете, что они перебирают данные полученного байта по битам с конца, я правильно Вас понял? И насколько я понимаю на входе в функцию поступает один байт и разбирается по битам? Не могли бы описать как правильно понять заголовок функции данные на входе, данные на выходе: Код:
|
03.09.2014, 17:18 | #4 |
Форумчанин
Регистрация: 21.01.2012
Сообщений: 240
|
char - 8-битный тип
unsigned char - это 8-битное число без знака, значит от 0 до 255. В дельфи аналог (из хелпа): Byte 0..255 unsigned 8-bit. Получается заголовок вроде такого: Код:
В этой функции берется XOR между входным байтом и seed-байтом, затем отрывается последний бит (самый правый). Если он равен нулю - то новый seed высчитывается сдвигом на разряд вправо старого seed (делением на 2). А если он не равен нулю - то высчитывается новый seed из старого как ((seed XOR $18) shr 1) or $80. После этого входной байт данных сдвигается вправо на 1 бит (делится на два). И вся эта мутотень повторяется 8 раз, т.е. для каждого бита из байта данных. От самого младшего бита до самого старшего. Вот еще ссылка про CRC: https://ru.wikipedia.org/wiki/Циклич...избыточный_код |
03.09.2014, 17:20 | #5 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Byte вместо unsigned char. Первый - возвращаемый тип, следующие два тип аргументов.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
03.09.2014, 19:28 | #6 |
Регистрация: 02.06.2010
Сообщений: 7
|
Большое спасибо за такие подробные и исчерпывающие ответы!
Если Вас не затруднит, да и может быть кому то пригодится код вычисления CRC-8 на дельфи, выкладываю то, что у меня получилось... Возможно где-то ошибся... Громко не смейтесь Почему-то мой расчет и расчет на калькуляторе CRC8 не совпадают, но может это моя ошибка или алгоритм подсчета все-таки отличается от оригинальной CRC8 (http://smbus.org/faq/crc8Applet.htm). Код:
|
03.09.2014, 19:53 | #7 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
03.09.2014, 20:24 | #8 | |
Регистрация: 02.06.2010
Сообщений: 7
|
Насколько я понял код С и описание данной процедуры Blackstripom
Код:
Цитата:
Поясните что я не так сделал? Спасибо! |
|
03.09.2014, 22:59 | #9 |
Форумчанин
Регистрация: 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 Так что поправьте на Код:
|
03.09.2014, 23:39 | #10 | |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,872
|
Цитата:
Плюс к вышесказанному ещё одна ошибка тут. Устанавливать старший бит после сдвига вправо нужно только тогда, когда до сдвига младший бит был равен 1. Ну и для проверки младшего бита вовсе не нужна конструкция типа Код:
Последний раз редактировалось northener; 03.09.2014 в 23:52. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Преобразовать код с 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 |