12 个解决方案
#1
读取出来处理喽,再写回去
#2
读再写吧
少于6个字。。。。
少于6个字。。。。
#3
试一下标准库中的bitset
#4
用文件定位fseek().
#5
1.从文件中读出,
2。按要求删除
3。写入新文件
4。删除旧文件
5。新文件改名
2。按要求删除
3。写入新文件
4。删除旧文件
5。新文件改名
#6
按字节读,读到需要处理的字节处,计算有几个字节需要参与处理,把需要删除的位清零,然后被处理过的字节(2个或3个)做与运算,合成为一个新的字节,然后使用memmove把后面完整的字节连接在这个合成的字节后。循环,重复刚才的过程。
#7
typedef struct
#8
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;
{
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;
#9
没实际调试,不一定对,仅供参考:
//有一个二进制文件,要求每隔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;
}
#10
调试通过的版本:
//有一个二进制文件,要求每隔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;
}
#11
一次读 50*8
写回 (50-12)×8
读缓冲50字节,写缓冲 50-12 =38字节,并清0
分别计算每个Bit所在字节和位每50Bits 或到写缓冲38Bits上
写回 (50-12)×8
读缓冲50字节,写缓冲 50-12 =38字节,并清0
分别计算每个Bit所在字节和位每50Bits 或到写缓冲38Bits上
#12
学习一下
#1
读取出来处理喽,再写回去
#2
读再写吧
少于6个字。。。。
少于6个字。。。。
#3
试一下标准库中的bitset
#4
用文件定位fseek().
#5
1.从文件中读出,
2。按要求删除
3。写入新文件
4。删除旧文件
5。新文件改名
2。按要求删除
3。写入新文件
4。删除旧文件
5。新文件改名
#6
按字节读,读到需要处理的字节处,计算有几个字节需要参与处理,把需要删除的位清零,然后被处理过的字节(2个或3个)做与运算,合成为一个新的字节,然后使用memmove把后面完整的字节连接在这个合成的字节后。循环,重复刚才的过程。
#7
typedef struct
#8
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;
{
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;
#9
没实际调试,不一定对,仅供参考:
//有一个二进制文件,要求每隔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;
}
#10
调试通过的版本:
//有一个二进制文件,要求每隔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;
}
#11
一次读 50*8
写回 (50-12)×8
读缓冲50字节,写缓冲 50-12 =38字节,并清0
分别计算每个Bit所在字节和位每50Bits 或到写缓冲38Bits上
写回 (50-12)×8
读缓冲50字节,写缓冲 50-12 =38字节,并清0
分别计算每个Bit所在字节和位每50Bits 或到写缓冲38Bits上
#12
学习一下