我有问题,我需要在C中的文本文件中写位 我想保存一个大小为5个字节的字符串,
char code[] = "0110";
在一个文件中逐位,这样最终文件大小只有4位。
Input: size(file) = 5 bytes.
Output: size(file) = 4 bits.
我的问题是:C中是否有一个可以执行此操作的函数(例如fwrite())?
答案 0 :(得分:1)
尝试将表示二进制数的字符串转换为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.
答案 1 :(得分:1)
C API(合理地)不允许您将4位写入文件。
我也不认为有一个文件系统会将内容记录为半字节!
这只是说你想要做的是将一个1
和0
的字符串解释为一个字节中的一串位。
为了做到这一点,你必须写位。 这通常通过按位运算符实现。
因此,例如,如果您有一个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++;
}
此代码将读取字符串中的每个字符并推送1
或0
(初始值为0x00
时甚至不需要,但效率不是此处的问题通过使用按位byte
运算符进入OR
。
这是一个非常简单的例子,你必须找出极端情况(如果输入字符串只有5个字节会怎么样),位排序问题(在那里放置那些5位,在字节的开头或结尾) ?开头和结尾意味着什么?)等等。