我有一个问题,我需要在 C 中的文本文件中写入位。
我想保存一个大小为 5 个字节的字符串,
char code[] = "0110";
在一个文件中一点一点,使最终的文件大小只有4位。
Input: size(file) = 5 bytes.
Output: size(file) = 4 bits.
我的问题是:C 中是否有一个函数(例如 fwrite() )可以做到这一点?
尝试将表示二进制数的字符串转换为字符,然后将字节写入文件。
您将有一些开销,因为您不能只写入 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 的字符串解释为一个字节中的一堆位。
为此,您必须写入位。这通常通过位运算符来实现。
因此,例如,如果您有一个 8 字节的“流” 10011100
,您可以使用以下代码打包一个字节:
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 个位放在哪里,在字节的开头还是结尾?还有什么?开始和结束的意思?)等。