用c++编写二进制数据

Writing binary data in c++

本文关键字:二进制 数据 c++      更新时间:2023-10-16

我正在为我和其他几个人正在建造的一台相当不寻常的机器建造一个汇编程序。这台机器需要18位指令,我正在用c++编写汇编程序。

我把所有的指令集合成一个32位无符号整数的向量,其中没有一个比18位无符号数所能表示的更大。

然而,似乎没有任何方法(据我所知)在c++中输出如此不寻常的位数到二进制文件,有人能帮助我吗?

(我也愿意使用C的studio和File结构。然而,似乎仍然没有任何方法可以输出这样任意数量的比特)。

谢谢你的帮助。

编辑:看起来我没有详细说明如何将指令存储在内存中。

指令在内存中是连续的。假设指令从内存中的位置0开始:

第一条指令将位于0。第二条指令位于18,第三条指令位于36,依此类推。

说明中没有空白或填充。如果需要,可以在程序末尾加上几个多余的0。

机器使用大端指令。因此,存储为3的指令应该映射为:000000000000000011

  • 保留一个8位累加器
  • 将当前指令的位移到累加器中,直到:
    • 累加器已满;或
    • 当前指令没有剩余位。
  • 当累加器已满时:
    • 将其内容写入文件并清除。
  • 当当前指令没有剩余比特时:
    • 移动到下一条指令。
  • 当没有指令时:
    • 将零移到累加器中,直到累加器满。
    • 写入其内容

对于n指令,这将在最后一条指令后留下(8 - 18n mod 8)零位。

有很多方法可以实现相同的最终结果(我假设最终结果是这18位的紧密包装)。

一个简单的方法是创建一个bit-packer类,它接受32位字,并生成一个缓冲区,从每个条目中打包18位字。这门课需要做一些变换,但我不认为它会特别困难。如果原始向量长度不是4的倍数,那么最后一个字节的末尾可以有几个零位。一旦将所有的单词交给这个类,就可以获得一个打包的数据缓冲区,并将其写入文件。

你可以用bitset表示你的数据,然后把bitset写入文件。不适合fstreams的write函数,但有一种方法在这里描述…

简短的回答:您的c++程序应该以您的特殊机器所期望的格式输出18位值。

我们需要更多的信息,特别是你的"不寻常的机器"期望的格式,或者更准确地说,你的汇编程序应该输出的格式。一旦理解了生成的输出的格式,答案就很简单了。

一种可能的格式——我在这里编的东西——是我们可以取你的两个18位指令:

         instruction 1       instruction 2     ...
       MSB            LSB  MSB            LSB  ...
bits → ABCDEFGHIJKLMNOPQR  abcdefghijklmnopqr  ...

…并将它们写入一个8位/字节的文件中:

KLMNOPQR CDEFGHIJ 000000AB klmnopqr cdefghij 000000ab ...

…这基本上是以"little-endian"的形式排列值,用6个0位将18位的值填充到24位。

但我假设:填充,小端序,位数/字节等。如果没有更多的信息,很难说这个答案是否接近正确,或者它是否正是你想要的。

另一种可能是紧密包装:

ABCDEFGH IJKLMNOP QRabcdef ghijklmn opqr0000

ABCDEFGH IJKLMNOP abcdefQR ghijklmn 0000opqr

…但是我已经做了一些假设了

只需将它们作为32位无符号整数输出到文件中,就像您在内存中一样,并使用您喜欢的端序。

然后,当加载器/eeprom写入器/JTAG或您使用的任何方法将代码发送到机器时,对于读取的每个32位字,只需省略14个更有效的位并将真正的18位发送到目标。

当然,除非你已经为你的机器写了一个FAT驱动程序…