如何在C ++中将单个字节写入文件

时间:2012-04-02 19:09:09

标签: c++ c

我发现我生成一个包含随机长度为“0”和“1”的字符串的事实,如何将数据作为位而不是ascii文本写入文件?

鉴于我的随机字符串有12位,我知道我应该写2个字节(或者再加4个0位来产生16位),以便写入第1个字节和第2个字节。

无论大小如何,假设我有一个char [8]或int [8]数组或一个字符串,如何将每个位组写为输出文件中的一个字节?

我到处搜索了很多(这是我第三天寻找答案)并且不明白该怎么做。

谢谢。

3 个答案:

答案 0 :(得分:3)

您没有使用位数组进行I / O.

相反,您需要执行两个单独的步骤。首先,将您的位数组转换为数字。然后,使用该数字执行二进制文件I / O.

第一步,uint8_t中的uint16_t<stdint.h>类型以及位操作运算符<<(向左移位)和|(或)会很有用。

答案 1 :(得分:2)

你还没有说过你正在使用什么API,所以我假设你正在使用I / O流。要将数据写入流,只需执行以下操作:

f.write(buf, len);

您不能写单个位,您将获得的最佳粒度是字节。如果你需要位,你必须在写入之前对字节缓冲区做一些按位工作。

如果要将8个元素的字符数组打包成一个字节,可以执行以下操作:

char data[8] = ...;
char byte = 0;
for (unsigned i = 0; i != 8; ++i)
{
    byte |= (data[i] & 1) << i;
}
f.put(byte);

如果data包含ASCII“0”或“1”字符而不是实际的0或1位,则将|=行替换为:

byte |= (data[i] == '1') << i;

答案 2 :(得分:2)

从数组中的位中创建一个unsigned char:

unsigned char make_byte(char input[8]) { 
    unsigned char result = 0;
    for (int i=0; i<8; i++)         
        if (input[i] != '0')
           result |= (1 << i);       
    return result;
}

这假设输入[0]应该成为字节中的最低有效位,输入[7]最重要。