Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: AlexMPEI (статус: 1-ый класс)
Вопрос отправлен: 27 ноября 2012, 16:50
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 29 ноября 2012, 18:33; участников в обсуждении: 2.
QWERYTY

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

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

AlexMPEI (статус: 1-ый класс), 29 ноября 2012, 17:21 [#3]:

очень неохота ради одной функции городить Сшную dll и таскать ее с собой, получая там ошибки на передаче строк.
QWERYTY

QWERYTY (статус: Посетитель), 29 ноября 2012, 18:08 [#4]:

for  byte_cnt := Length(data) downto 1 do
Да вот тут сразу не сообразил с downto, и переписывать в итоге не стал.

Вы бы объяснили что она делает, даже наверное не это главное.
А главное почему у вас изменилось количество аргументов.
Не может ли эта функция работать с обычными WORD, BYTE и PBYTE?

Зачем там столько выкрутасов? Вместо:
w := Word($ffff);
Нельзя написать?:
w := 65535
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
QWERYTY

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: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): В мини-форуме готовые решения.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:39
Выполнено за 0.03 сек.