【问题标题】:Write binary file C from unsigned char从 unsigned char 写入二进制文件 C
【发布时间】:2020-08-10 11:17:20
【问题描述】:

我正在制作一个写入二进制文件的程序,这个二进制文件的内容在一个无符号字符指针中。下一个代码是我用来生成二进制文件的方式

while (f > 0) {
    oct = (unsigned char) *datosOct->informacion++;

    for (int i = 2; i >= 0; --i)
    {   
        char actual = ((oct & (1 << i)) ? '1' : '0');
        temporal = appendCharToCharArray(temporal, actual);
    }           
    f--;
}
datosBin->informacion = (unsigned char*)temporal;

我在 wb 模式下使用了fopen,但它的字面意思是写一个包含 1 和 0 的文件。这是我用来编写的函数(我使用 Visual Studio 的默认编译器)。我用下面的代码写文件

file = fopen(nombreArchivo, "wb");
fwrite(datosBin->informacion, sizeof(char), archivoEnOctal->tamanio, file);

我的出发点是一个包含'1's 和'0's 的char 数组,'1's 和'0's 的每个字节代表一个ASCII 值。例如,'1010000' 是表示字母“P”的 ASCII 80,如果我在找到 ASCII 为 00 的值时将二进制字符数组(“1010000”)转换为字符数组(“P”),则将它们视为文本的结尾,并且不会将它们写入最终文件。我的代码的可能输出之一是图像,因此我需要将这些值写入 00。我尝试使用此方法直接写入字符,但由于我之前提到的原因,这不适用于图像

while (f > 0) {
    oct = (unsigned char) *datosOct->informacion++;

    for (int i = 2; i >= 0; --i)
    {   
        if (size == 8) {
            size = 0;
            char nuevaLetra = strtol(temporal, 0, 2); 
            if (nuevaLetra == 00) {
                nuevaLetra = '\0';
                //nuevaLetra = (char) 0;
            }
            response = appendCharToCharArray(response, nuevaLetra);
            temporal = (char*)"";
        }
        size++;
        char actual = ((oct & (1 << i)) ? 1 : 0);
        temporal = appendCharToCharArray(temporal, actual);
    }           
    f--;
}

【问题讨论】:

  • 你有什么问题?
  • 只写二进制,甚至不写二进制? char actual = ((oct &amp; (1 &lt;&lt; i)) ? '1' : '0'); 分配 字符 '0' 或 '1' 而不是 值 0 或 1。
  • 只写字节。
  • @juanjosemontoya - 代码 char actual = ((oct &amp; (1 &lt;&lt; i)) ? 1 : 0); 与 char actual = ((oct &amp; (1 &lt;&lt; i)) ? '1' : '0'); 不同 - 您最后的评论是不真实的。
  • @enhzflep 当我使用 char 实际 = ((oct & (1

标签: c


【解决方案1】:

在查看 output.txt 之前,我会留给你构建和运行它

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    unsigned char data;
    unsigned char numBitsValid;
} bitAccumalator_t;

int main()
{
    FILE *fp = fopen("output.txt", "wb");
    char *inputStream = "011001000110111101100101011100110010000001110100011010000110100101110011001000000110100001100101011011000111000000111111";
    int numBits = strlen(inputStream);
    bitAccumalator_t outBuffer = {0,0};
    for (int i=0; i<numBits; i++)
    {
        outBuffer.data <<= 1;
        if (inputStream[i] == '1')
        {
            outBuffer.data |= 1;
        }
        outBuffer.numBitsValid++;

        if (outBuffer.numBitsValid == 8)
        {
            fwrite(&outBuffer.data, 1, 1, fp);
            outBuffer.data = 0;
            outBuffer.numBitsValid = 0;
        }
    }
    fclose(fp);
    return 0;
}

【讨论】:

  • 哇,令人印象深刻,您能否向我们解释一下您的代码是如何工作的?我是 C 的新手
  • @JohnGuzman - 尝试使用调试器单步执行代码。它将 1 或 0 放入累加器的最低有效位,直到它填满字节。完成后,它将该字节写入输出。 &lt;&lt;= 和 |= 是按位运算符。 00000001b
  • 是的!谢谢。现在我的问题是,如果我们将这些字符保存到一个数组中,然后将它们全部写入文件而不是一个一个地写入文件,这也应该有效?
  • @JohnGuzman - 是的,绝对的。这是首选方法 - 我只是想提供一个易于理解的答案。
  • 关于:outBuffer.data |= 1; 这总是会设置相同的位。可能不是你想要的。建议在该语句之前插入:outBuffer.data &lt;&lt;= 1;
猜你喜欢
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
相关资源
最近更新 更多