c语言如何对二进制文件的每一bit进行操作?

wanghl02 2013-09-14 06:50:51
例如,有一个二进制文件,要求每隔50bits,删除后面的12bits。
...全文
779 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xusir98 2013-10-04
  • 打赏
  • 举报
回复
学习一下
lm_whales 2013-10-02
  • 打赏
  • 举报
回复
一次读 50*8 写回 (50-12)×8 读缓冲50字节,写缓冲 50-12 =38字节,并清0 分别计算每个Bit所在字节和位每50Bits 或到写缓冲38Bits上
赵4老师 2013-09-30
  • 打赏
  • 举报
回复
调试通过的版本:
//有一个二进制文件,要求每隔50bits,删除后面的12bits。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fi,*fo;
char buf[31];
char obf[31];
int bn,n;
void filter() {//对buf中前n个字节中的位,每隔50bits,忽略12bits,结果放在obf中,且将bn设置为obf中的字节数。
    char bit[249];
    char obt[249];
    char b8[33];
    char b88[33];
    int i,j;
    char *e;

    for (i=0;i<n;i++) {
        _itoa(buf[i],b8,2);
        sprintf(b88,"%032s",b8);
        sprintf(bit+i*8,"%s",b88+24);
    }

    j=0;
    for (i=0;i<n*8;i++) {
        if (i%62<50) {
            obt[j]=bit[i];
            j++;
        }
    }
    if (j%8) {
        bn=(j/8+1)*8;
    } else {
        bn=j;
    }
    for (i=j;i<bn;i++) obt[i]='0';
    obt[bn]=0;
    bn=bn/8;
    for (i=0;i<bn;i++) {
        strncpy(b8,obt+i*8,8);b8[8]=0;
        obf[i]=(char)strtol(b8,&e,2);
    }
}
int main() {
    fi=fopen("in.bin","rb");
    if (NULL==fi) {
        printf("Can not open file in.bin!\n");
        return 1;
    }
    fo=fopen("out.bin","wb");
    if (NULL==fo) {
        fclose(fi);
        printf("Can not open file out.bin!\n");
        return 2;
    }
    while (1) {
        n=fread(buf,1,31,fi);
        if (0==n) break;
        filter();
        fwrite(obf,1,bn,fo);
    }
    fclose(fo);
    fclose(fi);
    return 0;
}
赵4老师 2013-09-30
  • 打赏
  • 举报
回复
没实际调试,不一定对,仅供参考:
//有一个二进制文件,要求每隔50bits,删除后面的12bits。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fi,*fo;
char buf[31];
char obf[31];
int bn,n;
void filter() {//对buf中前n个字节中的位,每隔50bits,忽略12bits,结果放在obf中,且将bn设置为obf中的字节数。
    char bit[249];
    char obt[249];
    char b8[9];
    int i,j;
    char *e;

    for (i=0;i<n;i++) {
        _itoa(buf[i],b8,2);
        sprintf(bit+i*8,"%08s",b8);
    }
    j=0;
    for (i=0;i<n*8;i++) {
        if (i%62<50) {
            obt[j]=bit[i];
            j++;
        }
    }
    if (j%8) {
        bn=(j/8+1)*8;
    } else {
        bn=j;
    }
    for (i=j;i<bn;i++) obt[i]='0';
    obt[bn]=0;
    bn=bn/8;
    for (i=0;i<bn;i++) {
        strncpy(b8,obt+i*8,8);
        obf[i]=(char)strtol(b8,&e,2);
    }
}
int main() {
    fi=fopen("in.bin","rb");
    if (NULL==fi) {
        printf("Can not open file in.bin!\n");
        return 1;
    }
    fo=fopen("out.bin","wb");
    if (NULL==fo) {
        fclose(fi);
        printf("Can not open file out.bin!\n");
        return 2;
    }
    while (1) {
        n=fread(buf,1,31,fi);
        if (0==n) break;
        filter();
        fwrite(obf,1,bn,fo);
    }
    fclose(fo);
    fclose(fi);
    return 0;
}
ylbhz 2013-09-29
  • 打赏
  • 举报
回复
typedef struct { unsigned b0:1; unsigned b1:1; unsigned b2:1; unsigned b3:1; unsigned b4:1; unsigned b5:1; unsigned b6:1; unsigned b7:1; } bit_8;
ylbhz 2013-09-29
  • 打赏
  • 举报
回复
typedef struct
wuchuan53 2013-09-15
  • 打赏
  • 举报
回复
按字节读,读到需要处理的字节处,计算有几个字节需要参与处理,把需要删除的位清零,然后被处理过的字节(2个或3个)做与运算,合成为一个新的字节,然后使用memmove把后面完整的字节连接在这个合成的字节后。循环,重复刚才的过程。
AnYidan 2013-09-14
  • 打赏
  • 举报
回复
1.从文件中读出, 2。按要求删除 3。写入新文件 4。删除旧文件 5。新文件改名
u011730237 2013-09-14
  • 打赏
  • 举报
回复
用文件定位fseek().
  • 打赏
  • 举报
回复
试一下标准库中的bitset
max_min_ 2013-09-14
  • 打赏
  • 举报
回复
读再写吧 少于6个字。。。。
一根烂笔头 2013-09-14
  • 打赏
  • 举报
回复
读取出来处理喽,再写回去

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧