【问题标题】:Write a BYTE or Array of bytes in Ada在 Ada 中写入一个 BYTE 或字节数组
【发布时间】:2014-03-26 22:13:55
【问题描述】:

我正在 Ada 中为 Brainf*** 编写一个简单的编译器,但是我在代码生成方面遇到了严重的麻烦,因此我无法正确生成带有操作码指令的二进制文件,因为每当我编写文件时,它像整数一样保存十六进制值。 (整数大小)

我制作了一个我尝试制作的简单样品:

With Ada, Ada.Sequential_IO, Ada.Integer_Text_IO;
Use Ada;

procedure main is

   type Byte is range -128 .. 127;
   for  Byte'Size use 16;

   package Bin_IO is new Sequential_IO(Integer);
   File      : Bin_IO.File_Type;
   FileName  : constant String := "teste.bin";
   Num       : Byte;

begin
   Bin_IO.Create(File => File,
                 Name => FileName);

   Num := 16#FF#;        
   Bin_IO.Write(File => File,
                Item => Num);

   Bin_IO.Close(File => File);
end main;

文件中的预期结果只是 FF 但是,当我在十六进制编辑器中打开文件时,我有 FF00 0000

如何正确保存操作码指令??

【问题讨论】:

  • 文件有多大?你确定十六进制编辑器不只是扩展它可以显示整个世界吗?换句话说,文件是 1 字节还是 4 字节大?
  • 把Bin_IO改成package Bin_IO is new Sequential_IO(Byte);还不够吗?
  • @WoutervanNifterick 这是我的另一个想法.....
  • 哦,当我尝试编写一个简单的 16#F# 时,我没有意识到我的错误,而不是它的工作,但是,当我尝试编写例如 16#FF# 时,我得到了一个错误:( ..
  • 那是因为那似乎超出了范围(-128 .. 127)

标签: ada


【解决方案1】:

尝试将第 9 行更改为:

package Bin_IO is new Sequential_IO(Byte);

它将通用包更改为字节序列。 Bin_IO.Write 现在应该改为写入 Bytes。

【讨论】:

  • 但请注意,OP 的 Byte 实际上是 16 位 (for Byte’Size use 16)。
【解决方案2】:

我找到了功能解决方案...

我将类型更改为字符类型,并且,我只是将机器操作码转换为字符类型并写入文件,工作非常好......,我不知道这是否是最好的方法,但工作

With Ada, Ada.Sequential_IO, Ada.Integer_Text_IO;
Use Ada;

procedure main is

   package Bin_IO is new Sequential_IO(Character);
   File      : Bin_IO.File_Type;
   FileName  : constant String := "teste.bin";
   Num       : Character;

begin
   Bin_IO.Create(File => File,
                 Name => FileName);

   Num := Character'Val(16#97#);
   Bin_IO.Write(File => File,
                Item => Num);

   Bin_IO.Close(File => File);
end main;

【讨论】:

  • 我认为更好的选择是使用Interfaces.Unsigned_8
猜你喜欢
  • 2010-11-01
  • 2011-01-08
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多