用c ++编写二进制数据

时间:2011-10-16 22:04:13

标签: c++ c stream binary stdio

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

我已经将所有指令收集到32位无符号整数的向量中,其中没有一个比用18位无符号数表示的更大。

然而,似乎没有任何方法(据我所知)在C ++中向二进制文件输出如此不寻常的位数,任何人都可以帮助我。

(我也愿意使用C的stdio和文件结构。但是似乎没有任何方法可以输出任意数量的位。)

感谢您的帮助。

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

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

第一条指令为0.第二条指令为18,第三条指令为36,依此类推。

说明书中没有间隙或填充物。如果需要,在程序结束时可能会有一些多余的0。

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

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

您可以在bitset中表示您的数据,然后将bitset写入文件。 不适用于fstreams写函数,但有一种方法that is described here ...

答案 2 :(得分:2)

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

一种简单的方法是创建一个接受32位字的bit-packer类,并生成一个缓冲区,用于打包每个条目的18位字。这个班需要做一些改变,但我不认为它特别困难。如果原始向量长度不是4的倍数,则最后一个字节最后可以有几个零位。一旦将所有单词提供给该类,就可以获得打包数据缓冲区,并将其写入文件。 / p>

答案 3 :(得分:0)

简短回答:您的C ++程序应该以您不寻常的机器所期望的格式输出18位值。

我们需要更多信息,特别是您的“异常机器”所期望的格式,或者更准确地说,是汇编器应该输出的格式。一旦你理解了你正在生成的输出格式是什么,答案应该是直截了当的。

一种可能的格式 - 我在这里做的事情 - 我们可以采取两条18位指令:

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

...并将其写入8位/字节文件中,因此:

KLMNOPQR CDEFGHIJ 000000AB klmnopqr cdefghij 000000ab ...

...这基本上是以“小端”形式排列值,其中6个零位将18位值填充为24位。

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

另一种可能性是紧密包装:

ABCDEFGH IJKLMNOP QRabcdef ghijklmn opqr0000

ABCDEFGH IJKLMNOP abcdefQR ghijklmn 0000opqr

...但我已经假设角落案件的位置在这里。

答案 4 :(得分:0)

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

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

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