2016-07-28 57 views
-1

有一个数组:我如何把二进制数组转换成二进制文件

int a[5] = { 1, 0, 0, 1, 1 }; 

当使用循环的每个元素放到一个文本文件,该文件的大小为5个字节。所以我想把这五个元素放到一个二进制文件中,这样大小就是5位。我怎样才能做到这一点?

+0

只是把它'fwrite'到一个二进制文件..真的,这是什么问题? –

+0

@EugeneSh。看看原帖 –

+0

哼。为什么编辑呢?编辑显然是相互冲突的。 @dbush –

回答

2

如果你想要写5个字节的文件,你应该使用类型unsigned char并打开输出文件为二进制:

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

int main(void) { 
    unsigned char a[5] = { 1, 0, 0, 1, 1 }; 
    FILE *fp = fopen("filename", "wb"); 
    if (fp == NULL) { 
     fprintf(stderr, "cannot open filename: %s\n", strerror(errno)); 
     exit(1); 
    } 

    if (fwrite(a, 1, 5, fp) != 5) { 
     fprintf(stderr, "cannot write to filename: %s\n", strerror(errno)); 
     fclose(fp); 
     exit(1); 
    } 

    fclose(fp); 
    return 0; 
} 

你的问题是豆蔻困惑:

所以我想把这五个元素放到一个二进制文件中,使其大小为5位

在大多数系统中,您不能将单个位写入文件和文件大小不是以位表示,而是以字节表示,通常是8位宽。您可以设置一个字节的规定值的5位,但你必须决定如何在一个字节位数...

如果位从最低显著编号到最显著,这里是你如何能做到这个:

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

/* assuming array `a` contains bit values */ 
int a[5] = { 1, 0, 0, 1, 1 }; 

int main(void) { 
    FILE *fp = fopen("filename", "wb"); 
    unsigned char b; 
    if (fp == NULL) { 
     fprintf(stderr, "cannot open filename: %s\n", strerror(errno)); 
     exit(1); 
    } 

    for (int i = 0; i < 5; i++) { 
     b |= a[i] << i; 
    } 
    fputc(b, fp); 
    fclose(fp); 

    return 0; 
} 
+0

我的意思是我有一个数字,如13,其二进制格式是0000 1101。事实上,我只希望有效二进制1101,前四个零应删除,所以我可以减少到8位4个比特。 – Varrian

+1

@Varrian:你的解释仍扑朔迷离。你是否希望文件包含4个字节,其中有效位值从最重要到最不重要? – chqrlie

+0

我发现我的错误,不是任何位数的可写入文件。我必须将多个字节写入文件。 – Varrian

相关问题