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