package CRC16 is
type m16 is mod 2**16;
generic
type TData is private;
function Get_CRC16(Data: TData) return m16;
end CRC16;
Файл реализации:
with ADA.Unchecked_Conversion;
package body CRC16 is
type m8 is mod 2**8;
type TTable is array (m8) of m16;
function Get_Table return TTable is
Result: TTable;
r: m16;
begin
for i in Result'Range loop
r := m16(i);
if (r and 1) = 1 then
r := r/2 xor 16#A001#; --???
else
r := r/2; -- ???
end if;
Result(i) := r;
end loop;
return Result;
end;
CRC16_Table: constant TTable := Get_Table;
function Get_CRC16(Data: TData) return m16 is
type m8_arr is array (1 .. TData'Size) of m8;
pragma Pack(m8_arr);
function Data_To_Arr is new Ada.Unchecked_Conversion(TData, m8_arr); --???
use type m8;
Result: m16;
p: m8_arr := Data_To_Arr(Data);
begin
Result := 16#FFFF#;
for i in p'Range loop
Result := (Result / 2**8) xor CRC16_Table(m8(Result and 16#FF#) xor p(i)); --???
end loop;
return Result;
end;
end CRC16;
Проблемы:
1. Как делать битовые сдвиги? Деление на степень двойки это как-то неправильно в данном случае.
2. m8Arr по размеру никак не хочет совпадать с TData