我发现我生成一个包含随机长度为“0”和“1”的字符串的事实,如何将数据作为位而不是ascii文本写入文件?
鉴于我的随机字符串有12位,我知道我应该写2个字节(或者再加4个0位来产生16位),以便写入第1个字节和第2个字节。
无论大小如何,假设我有一个char [8]或int [8]数组或一个字符串,如何将每个位组写为输出文件中的一个字节?
我到处搜索了很多(这是我第三天寻找答案)并且不明白该怎么做。
谢谢。
答案 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]最重要。