簡體   English   中英

用C ++編寫二進制數據

[英]Writing binary data in c++

我正在為我和其他一些人正在建造的相當不尋常的機器建造一個匯編器。 這台機器需要18位指令,我正在用C ++編寫匯編程序。

我已將所有指令收集到一個32位無符號整數的向量中,沒有一個大於可以用18位無符號整數表示的值。

但是,據我所知,似乎沒有任何方法可以將如此不同尋常的位數輸出到C ++中的二進制文件中,任何人都可以幫我解決這個問題。

(我也願意使用C的stdio和File結構。但是,似乎還沒有任何方法可以輸出這樣任意數量的位)。

謝謝您的幫助。

編輯:看來我沒有指定如何將指令足夠好地存儲在內存中。

指令在內存中是連續的。 假設指令從內存中的位置0開始:

第一條指令為0。第二條指令為18,第三條指令為36,依此類推。

說明中沒有間隙或填充。 如果需要,在程序結尾可以有一些多余的0。

機器使用大字節序指令。 因此,存儲為3的指令應映射到:000000000000000011

  • 保留一個八位累加器。
  • 將位從當前指令移位到累加器,直到:
    • 蓄能器已滿; 要么
    • 當前指令中沒有剩余的位。
  • 每當累加器裝滿時:
    • 將其內容寫入文件並清除。
  • 只要當前指令中沒有剩余的位:
    • 移至下一條指令。
  • 如果沒有其他說明:
    • 將零移位到累加器中,直到充滿為止。
    • 寫其內容。
    • 結束。

mod 8) zero bits after the last instruction. 對於n條指令,這將在最后一條指令之后保留(8-18 mod 8)個零位。

也許你可以代表你的數據在一個位集合 ,然后寫位集到一個文件中。 無法與fstreams寫入功能一起使用,但是此處描述了一種方法...

有很多方法可以達到相同的最終結果(我假設最終結果是這18位的緊密包裝)。

一種簡單的方法是創建一個接受32位字的位打包程序類,並生成一個將每個條目中的18位字打包的緩沖區。 班級需要做一些轉變,但我並不認為這會特別困難。 如果原始向量長度不是4的倍數,則最后一個字節的末尾可以有幾個零位。一旦將所有字都輸入此類,就可以獲取打包的數據緩沖區並將其寫入文件。

簡短的答案:您的C ++程序應以異常機器所需的格式輸出18位值。

我們需要更多信息,尤其是您“異常機器”所期望的格式,或更准確地說,是您的匯編程序應輸出的格式。 一旦了解了生成的輸出格式是什么,答案就應該很簡單。

一種可能的格式(我正在整理)是我們可以采用您的18位指令中的兩條:

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

...並將它們寫入8位/字節的文件中,因此:

KLMNOPQR CDEFGHIJ 000000AB klmnopqr cdefghij 000000ab ...

...這基本上是按“ little-endian”形式排列值,其中6個零位將18位值填充為24位。

但是我假設是:填充,小字節序,位/字節數等。如果沒有更多信息,很難說這個答案是否幾乎是正確的,或者正是您想要的。

另一種可能性是包裝緊湊:

ABCDEFGH IJKLMNOP QRabcdef ghijklmn opqr0000

要么

ABCDEFGH IJKLMNOP abcdefQR ghijklmn 0000opqr

...但是我已經確定了極端情況在哪里。

只需將它們作為32位無符號整數輸出到文件中即可,就像您在內存中一樣,並具有您喜歡的字節序。

然后,當加載程序/ eeprom編寫器/ JTAG或用於將代碼發送到計算機的任何方法時,對於讀取的每個32位字,只需忽略14個更高的有效位並將實際的18位發送給目標即可。

當然,除非您為計算機編寫了FAT驅動程序...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM