C++ 如何将单个字节写入C++;

C++ 如何将单个字节写入C++;,c++,c,C++,C,假设我生成了一个包含随机长度的“0”和“1”的字符串,那么如何将数据作为位而不是ascii文本写入文件 考虑到我的随机字符串有12位,我知道我应该写2个字节(或者再加4个0位,得到16位),以便写第一个字节和第二个字节 不管大小如何,如果我有一个char[8]或int[8]数组或一个字符串,我如何将每一组位作为一个字节写入输出文件 我在谷歌搜索了很多地方(这是我寻找答案的第三天),但不知道怎么做 谢谢。您不会使用位数组进行I/O 相反,您需要执行两个单独的步骤。首先,将位数组转换为数字。然后,使

假设我生成了一个包含随机长度的“0”和“1”的字符串,那么如何将数据作为位而不是ascii文本写入文件

考虑到我的随机字符串有12位,我知道我应该写2个字节(或者再加4个0位,得到16位),以便写第一个字节和第二个字节

不管大小如何,如果我有一个char[8]或int[8]数组或一个字符串,我如何将每一组位作为一个字节写入输出文件

我在谷歌搜索了很多地方(这是我寻找答案的第三天),但不知道怎么做


谢谢。

您不会使用位数组进行I/O

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


对于第一步,在
中找到的类型
uint8\u t
uint16\u t
以及位操作运算符
不使用位数组执行I/O操作

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


对于第一步,在
中找到的类型
uint8\u t
uint16\u t
以及位操作操作符
您没有说明您正在使用什么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);

您还没有说明您使用的是什么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);

从数组中的位生成无符号字符:

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;
}
无符号字符生成字节(字符输入[8]){
无符号字符结果=0;

对于(int i=0;i从数组中的位生成一个无符号字符:

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;
}
无符号字符生成字节(字符输入[8]){
无符号字符结果=0;

对于(int i=0;iDid您的意思是在问题标题中说“位”吗?字节,当前读取所有响应您的意思是在问题标题中说“位”吗?字节,当前读取所有响应如果OP的字符串实际包含“0”和“1”字符,则需要测试条件,即
输入[i]!='0'
。如果OP的字符串实际上包含'0'和'1'字符,则需要测试条件,即输入[i]!='0'
。我认为建议使用fstream(“outfile.txt”,ios:binary)。我会使用流的
(“outfile.txt”,ios::out;ios::binary);
。虽然我不确定.txt扩展名在编写二进制数据时是否有意义。但是扩展名与
数据[I]不相关吗&1
将适用于数字
0
/
1
和字符
'0'
/
'1'
@BenVoigt您是对的。我想可能是这种情况,但我不想麻烦查看ASCII表进行检查。:)我建议使用fstream(“outfile.txt”,ios:binary),我相信?我会使用流的
(“outfile.txt”),ios::out | ios::binary);
。尽管我不确定.txt扩展名在您编写二进制数据时是否有意义。扩展名与
数据[I]不相关吗&1
将适用于数字
0
/
1
和字符
'0'
/
'1'
@BenVoigt您是对的。我想可能是这种情况,但我懒得查看ASCII表进行检查。:)希望我能说是并接受每个人的回答,谢谢大家希望我能说是并接受每个人的回答,谢谢大家