|
Вопрос # 6 319/ вопрос решён / |
|
Здравствуйте, эксперты!
помогите конвертировать функцию из С++ в Делфи:
uint16_t WordCrc16 (uint8_t *Data, uint16_t size)
{
uint16_t w;
uint8_t shift_cnt,f;
uint8_t *ptrByte;
uint16_t byte_cnt = size;
ptrByte = Data;
w = (uint16_t)0xffff;
for (;byte_cnt>0;byte_cnt--)
{
w = (uint16_t)(w^(uint16_t)(*ptrByte++));
for (shift_cnt = 0; shift_cnt<8; shift_cnt++)
{
f=(uint8_t)((w)&(0x1));
w>>=1;
if ((f) ==1)
w = (uint16_t)((w)^0xa001);
}
}
return w;
}
 |
Вопрос задал: AlexMPEI (статус: 1-ый класс)
Вопрос отправлен: 27 ноября 2012, 16:50
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 5; последнее сообщение — 29 ноября 2012, 18:33; участников в обсуждении: 2.
|
QWERYTY (статус: Посетитель), 28 ноября 2012, 06:17 [#1]:
Не стыдно вопрос такой задавать?
Самому ведь интересней разобраться. Вы будете так все исходники найденные просить переделать?
Сначала нужно всё это привести в нормальный(с точки зрения программиста на паскале) вид:
function WordCrc16(Data: uint8_t *; size: uint16_t): uint16_t;
var
byte_cnt, w, I: uint16_t;
shift_cnt, f: uint8_t;
ptrByte: uint8_t *; // Вот тут даже не разбираясь с типами
// глядя на имя переменной хочется поставить тип PBYTE
begin
byte_cnt := size;
ptrByte := Data;
w := (uint16_t)0xffff;
for I := 0 to byte_cnt - 1 do
begin
w := (uint16_t)(w^(uint16_t)(*ptrByte++));
for shift_cnt := 0 to 7 do
begin
f :=(uint8_t)((w)&(0x1));
w>>=1;
if (f) = 1 then w := (uint16_t)((w)^0xa001);
end;
end;
result := w;
end;
Потом нужно почитать про типы которые встречаются в этой функции и подобрать аналоги в делфи. Потом про указатели и операции с ними в си. Потом тоже самое но для делфи.
И вот уже что останется самое сложное для вас(например мало информации в интернете, или вы не понимаете что пишут) спрашивать.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
AlexMPEI (статус: 1-ый класс), 29 ноября 2012, 17:20 [#2]:
переписал вот так. неправиьлно считает. HELP
function CRC16(data: string): string;
var
w: Word;
shift_cnt,f: byte;
byte_cnt: Word;
begin
w := Word($ffff);
for byte_cnt := Length(data) downto 1 do
begin
w := Word(w xor (Word(data[byte_cnt])));
for shift_cnt := 0 to 7 do
begin
f := byte((w) and ($1));
w := w shr 1;
if (f = 1) then
w := Word((w) xor ($A001));
end;
end;
result := IntToHex(w, 2);
end;
|
|
AlexMPEI (статус: 1-ый класс), 29 ноября 2012, 17:21 [#3]:
очень неохота ради одной функции городить Сшную dll и таскать ее с собой, получая там ошибки на передаче строк.
|
|
QWERYTY (статус: Посетитель), 29 ноября 2012, 18:08 [#4]:
for byte_cnt := Length(data) downto 1 do
Да вот тут сразу не сообразил с downto, и переписывать в итоге не стал.
Вы бы объяснили что она делает, даже наверное не это главное.
А главное почему у вас изменилось количество аргументов.
Не может ли эта функция работать с обычными WORD, BYTE и PBYTE?
Зачем там столько выкрутасов? Вместо:
w := Word($ffff);
Нельзя написать?:
w := 65535
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
QWERYTY (статус: Посетитель), 29 ноября 2012, 18:33 [#5]:
Вторая версия. Ревизия 0. 
function Crc16(Data: PBYTE; size: WORD): WORD;
var
byte_cnt, w: WORD;
shift_cnt, f: BYTE;
ptrByte: PBYTE;
begin
//byte_cnt := size;
ptrByte := Data;
w := $ffff;
for byte_cnt := size downto 1 do
begin
w := w xor (BYTE(ptrByte^) + 1); // Вот тут бы вы пояснили
//кто кого там исключает и зачем.
for shift_cnt := 0 to 7 do
begin
f := w and $1;
w := w shr 1;
if f = 1 then w := w xor $A001; // Зачем тут скобки?
// Они нужны когда условий много. Прим: (выражение) and (выражение) or (выражение)
end;
end;
result := w;
end;
Вот теперь можно подумать если не пашет. Где и что.
Можно избавиться от указателя, если вам это ни к чему и передавать все аргументы как значения.
Может ещё чтото можно оптимизировать. Я то не вникая в задачу пытаюсь повторить сишный код.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
18 марта 2013, 21:19: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): В мини-форуме готовые решения.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|