首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理外来二进制数据的公约

处理外来二进制数据的公约
EN

Stack Overflow用户
提问于 2021-07-10 04:42:52
回答 1查看 128关注 0票数 5

我是一个C程序员,几周前开始学习Ada。我对Ada如何处理外来二进制数据感到困惑,例如在解码存储在串行输入缓冲区中的通信数据包时。

在C中,我将定义一个打包结构,以反映数据包的布局,然后将指针到缓冲区转换为指针到结构,以访问通信数据中的各个元素。在Ada中,典型的解码方式是什么?

我尝试用以下方法在Ada中复制C的相同方法

代码语言:javascript
复制
-- 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
   );
代码语言:javascript
复制
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;

然后,我定义了通信接收缓冲区的数组,该缓冲区接受外来二进制数据(可能来自不同的体系结构):

代码语言:javascript
复制
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);

然后是解码这类通信的过程

代码语言:javascript
复制
procedure Decode_Packet (Packet_Provided : in Packet);
代码语言:javascript
复制
-- 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;

但是,编译器禁止错误地进行这种转换,如图所示。谢谢你读了这么多。我的问题是,

关于外国二进制数据解码的正确方法,我是“在球场里”,还是有更好的方法去做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-10 07:34:33

  1. 如果您确定数据具有正确的对齐方式,则可以将数据包对象映射到Communication_Data分配的空间:
代码语言:javascript
复制
Buffer : Communication_Buffer (0 .. 20);
Pkg    : Packet;
pragma Import (Ada, Pkg);
for Pkg'Address use Buffer (0)'Address;

方面语法也是如此:

代码语言:javascript
复制
Buffer : Communication_Buffer (0 .. 20);
Pkg    : Packet
 with Import, Address => Buffer (0)'Address;
  1. 另一种方法是使用Ada.Unchecked_Conversion,但您应该确保缓冲区和数据包的大小相同:
代码语言:javascript
复制
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));

PS。如果您想要一个独立的独立代码,您还可能需要一个订单 (GNAT实现定义的)方面。

PS。我还建议大家看看安全可靠的软件小册子中的“安全通信”一章。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68324778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档