簡體   English   中英

如何在 c++ 中逐位讀取/寫入位序列

[英]how to read/write sequnce of bits bit by bit in c++

我已經在 C++ 中實現了霍夫曼編碼算法,並且運行良好。 我想創建一個文本壓縮算法。

在數字世界的每一個文件或數據的背后,都有 0/1。

我想在文件中保留由霍夫曼編碼算法生成的位序列( 0/1 )。

我的目標是保存要存儲的文件中使用的位數。 我將用於解碼的元數據存儲在單獨的文件中。 我想將數據逐位寫入文件,然后在 c++ 中逐位讀取相同的數據。

我在使用二進制模式時面臨的問題是它不允許我一點一點地放置數據。 我想將“10101”逐位放入文件中,但它一次放入 asci 值或每個字符的 8 位。

代碼

#include "iostream"
#include "fstream"
using namespace std;

int main(){
    ofstream f;
    f.open("./one.bin", ios::out | ios::binary);
    f<<"10101";
    f.close();

    return 0;
}

output

在此處輸入圖像描述

任何幫助或幫助指針表示贊賞。 謝謝你。

“二進制模式”僅表示您已請求您寫入的實際字節不會被行尾轉換損壞。 (這只是 Windows 上的問題。沒有其他系統需要故意破壞您的數據。)

您仍然以二進制模式一次寫入一個字節。

要寫入位,請將它們累積在 integer 中。 為方便起見,在未簽名的 integer 中。 這是您的位緩沖區。 您需要決定是從最不重要的位置到最重要的位置還是從最重要的位置到最不重要的位置來累積它們。 一旦累積了八位或更多位,就將一個字節寫入文件,然后從緩沖區中刪除這八位。

完成后,如果緩沖區中還剩下一些位,則將最后的 1 到 7 位寫入一個字節。 您需要仔細考慮您是如何做到這一點的,以及如何知道有多少位,以便您可以正確解碼另一端的位。

累積和提取是使用您的語言中的位操作完成的。 在 C++(和許多其他語言)中,這些是& (和), | (或)、 >> (右移)和<< (左移)。

例如,要在緩沖區中插入一位x ,然后在y中插入三位,最后以最重要的位置中的最早位結束:

unsigned buf = 0, bits = 0;

...

// some loop
{
   ...

   // write one bit (don't need the & if you know x is 0 or 1)
   buf = (buf << 1) | (x & 1);
   bits++;

   ...

   // write three bits
   buf = (buf << 3) | (y & 7);
   bits += 3;

   ...

   // write bytes from the buffer before it fills the integer length
   if (bits >= 8) {     // the if could be a while if expect 16 or more
       // out is an ostream -- must be in binary mode if on Windows
       bits -= 8;
       out.put(buf >> bits);
   }

   ...

}

...

// write any leftover bits (it is assumed here that bits is in 0..7 --
// if not, first repeat if or while from above to clear out bytes)
if (bits) {
    out.put(buf << (8 - bits));
    bits = 0;
}

...

暫無
暫無

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

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