0

LZW アルゴリズムとハッシュ テーブルを使用して圧縮ファイルを作成するプログラムがあります。私の圧縮ファイルには現在、ハッシュテーブルのインデックスに対応する整数が含まれています。この圧縮ファイルの最大整数は約 46000 で、16 ビットで簡単に表すことができます。次のコードを使用して、この「compressedfile.txt」をバイナリファイル「binary.bin」に変換すると(ファイルサイズをさらに縮小するため)、「binary.bin」ファイルに32ビット整数が含まれます。たとえば、圧縮ファイルに数字 84 がある場合、バイナリ ファイルでは 5400 0000 に変換されます。

std::ifstream in("compressedfile.txt");
std::ofstream out("binary.bin", ios::out | std::ios::binary);

int d;
while(in >> d)
{out.write((char*)&d, 4);}

私の質問は、「5400 0000」の末尾の「0000」を破棄できないかということです。これにより、ファイルで余分な 2 バイトが使用されます。これは、私の最大整数が 46000 であり、2 バイトのみで表現できるため、すべての整数に当てはまります。私のバイナリファイルのベースをそのように設定できるコードはありますか? 私の質問が明確であることを願っています。

4

1 に答える 1

5

d のアドレスにある 4 バイト (整数、多くのプラットフォームでは 32 ビット) に、指定した内容を正確に書き込んでいます。16 ビット型を使用し、代わりに 2 バイトを書き込みます。

uint16_t d; // unsigned to ensure it's large enough to hold your max value of 46000
while (in >> d) out.write(reinterpret_cast<char*>(&d), sizeof d);

編集:コメントで指摘されているように、このコードとそれが生成するデータをプロセッサアーキテクチャ間で移植できるようにするには、出力のエンディアン規則を選択する必要があります。htons()を使用して uint16_t を広く利用可能なネットワーク バイト オーダーに変換することをお勧めしますが、(まだ) C++ 標準の一部ではありません。

于 2013-10-28T15:04:39.020 に答える