我是一名 C 程序员,几周前开始学习 Ada。我一直对 Ada 如何处理外部二进制数据感到困惑,例如在解码存储在串行输入缓冲区中的通信数据包时。
在 C 中,我将定义一个打包结构来反映数据包的布局,然后将指向缓冲区的指针转换为指向结构的指针以访问通信数据中的各个元素。在 Ada 中进行这种解码的典型方法是什么?
我尝试使用以下方法在 Ada 中为 C 复制相同的方法
-- Fundamental types for fields in the packet
type Station_Addr_Type is mod 2**8;
type Func_Code_Type is (FUNC1, FUNC2);
for Func_Code_Type use
(
FUNC1 => 1,
FUNC2 => 2
);
type Packet is
record
Station_Addr : Station_Addr_Type;
Func_Code : Func_Code_Type;
end record;
-- attempts to reflect packet binary layout
for Packet use
record at mod 1;
Station_Addr at 0 range 0 .. 7;
Func_Code at 1 range 0 .. 7;
end record;
然后,我为接受外部二进制数据(可能来自不同架构)的通信接收缓冲区定义了数组:
type Communication_Data is mod 2**8;
for Communication_Data'Size use 8;
type Communication_Buffer is array (Natural range <>) of Communication_Data;
Buffer : Communication_Buffer (0 .. 20);
然后是解码此类通信的程序
procedure Decode_Packet (Packet_Provided : in Packet);
-- non-working sample
declare
begin
-- Attempts to sanity-check packet by object casting
Decode_Packet (Packet (Buffer));
---------------^----
Error: invalid conversion, not compatible with type "Communication_Buffer"
exception
when others =>
raise Decode_Failure;
end;
但是,编译器禁止这样的错误转换,如图所示。感谢您阅读到这里。我的问题是,
关于解码外国二进制数据的正确方法,我是“在球场上”,还是有更好的方法来做到这一点?
Buffer : Communication_Buffer (0 .. 20);
Pkg : Packet;
pragma Import (Ada, Pkg);
for Pkg'Address use Buffer (0)'Address;
与方面语法相同:
Buffer : Communication_Buffer (0 .. 20);
Pkg : Packet
with Import, Address => Buffer (0)'Address;
subtype Packet_Buffer is Communication_Buffer (1 .. 2);
function To_Packet is new Ada.Unchecked_Conversion
(Packet_Buffer, Packet);
Pkg : Packet := To_Packet (Buffer (0 .. 1));
附注。如果您想要一个独立于字节序的代码,您可能还需要一个Scalar_Storage_Order(GNAT 实现定义)方面。
附注。我还建议您查看安全和安全软件手册中的“安全通信”一章。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句