Помощь - Поиск - Пользователи - Календарь
Полная версия: Написание модуля для расчёта CRC16
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
TarasBer
Файл описания:

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
volvo
Цитата
Как делать битовые сдвиги? Деление на степень двойки это как-то неправильно в данном случае.
Битовые сдвиги реализуются не операторами, а функциями. В пакете Interfaces есть:

   function Shift_Left  (Value : Unsigned_n; Amount : Natural) return Unsigned_n;
function Shift_Right (Value : Unsigned_n; Amount : Natural) return Unsigned_n;
function Shift_Right_Arithmetic (Value : Unsigned_n; Amount : Natural) return Unsigned_n;
function Rotate_Left (Value : Unsigned_n; Amount : Natural) return Unsigned_n;
function Rotate_Right (Value : Unsigned_n; Amount : Natural) return Unsigned_n;


Цитата
m8Arr по размеру никак не хочет совпадать с TData
TData'Size - это размер TData в битах
TarasBer
> TData'Size - это размер TData в битах

То есть дело не в том, что массив байтов забыл упаковаться, он упаковывается сам?

Кстати, Table_CRC16 в данном случае считается компилятором или программой при старте?
volvo
Цитата
То есть дело не в том, что массив байтов забыл упаковаться, он упаковывается сам?
В данном конкретном случае pragma Pack может отсутствовать, компилятор сам догадается, что надо сделать.

Цитата
Table_CRC16
это что? CRC16_Table? При старте программы. Еще раз повторяю: constant не гарантирует вычисления на этапе компиляции. Constant гарантирует только иммутабельность (неизменность) объекта. Если для вычисления значения надо вызвать функцию, то это произойдет на этапе запуска программы. Если можно вычислить константу при компиляции - она будет вычислена при компиляции.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.