問題があります。C でテキスト ファイルにビットを書き込む必要があります
。サイズが 5 バイトの文字列を保存したいのですが、
char code[] = "0110";
最終的なファイルサイズがわずか4ビットになるように、ファイルを少しずつ。
Input: size(file) = 5 bytes.
Output: size(file) = 4 bits.
私の質問は次のとおりです。これを実行できる C の関数 ( fwrite() など) はありますか?
2 進数を表す文字列を char に変換してから、そのバイトをファイルに書き込んでみてください。
4 ビットしか書き込めないため、オーバーヘッドが発生します。
char *in = "0110";
char out = 0;
int i = 0;
while (in[i] != '\0') {
out = out * 2 + in[i] - '0';
i++;
}
// Write out in your file.
C API では (合理的に) ファイルに 4 ビットを書き込むことはできません。また、コンテンツの記録をハーフバイトとして保持するファイルシステムも存在しないと思います! これは、あなたがしたいことは、1
s と0
s の文字列を 1 バイトのビットの集まりとして解釈することだと言っているだけです。
そのためには、ビットを書き込む必要があります。これは通常、ビット単位の演算子で実現されます。
たとえば、8 バイトの「ストリーム」がある場合10011100
、次のコードで 1 バイトをパックできます。
char *sb = "10011100";
unsigned char next = 0; // Next bit to process
unsigned char pos = 0; // Position of next bit
unsigned char byte = 0; // Where to store the result
for (i = 0; i < 8; i++) {
if ((*sb) == '1') {
next = 0x01;
}
else {
next = 0x00;
}
byte |= next << pos;
pos++;
}
このコードは、文字列から各文字を読み取り、ビットごとの演算子を使用してa1
または a 0
(初期値が0x00
であるため必要ありませんが、ここでは効率は問題になりません)をプッシュします。byte
OR
これは非常に単純な例です。コーナー ケース (入力文字列が 5 バイトしかない場合)、ビット順序の問題 (これらの 5 ビットをバイトの先頭または末尾のどこに配置するか) を把握する必要があります。始まりと終わりの意味?)など