繁体   English   中英

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

[英]How to write individual bytes to filein C++

考虑到我生成的字符串包含随机长度的“ 0”和“ 1”,我如何将数据以位而不是ascii文本的形式写入文件?

给定我的随机字符串有12位,我知道我应该写2个字节(或再添加4个0位以形成16位),以便写第一个字节和第二个字节。

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

我到处都用Google搜索了很多东西(这是我寻找答案的第三天),却不知道该怎么做。

谢谢。

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

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

第一步,在<stdint.h>找到类型uint8_tuint16_t以及位操作运算符<< (向左移动)和| (或)会很有用。

您尚未说明正在使用什么API,所以我假设您正在使用I / O流。 要将数据写入流,只需执行以下操作:

f.write(buf, len);

您不能写单个位,您将获得的最佳粒度是字节。 如果需要位,则必须先对字节缓冲区进行按位工作,然后再写入。

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

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;

从数组的位中取出一个无符号字符:

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;
}

假定input [0]应该成为字节中的最低有效位,而input [7]应该成为最高有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM