回 帖 发 新 帖 刷新版面

主题:C语言读写文件的问题,疑惑中

[code=c]
#include <stdio.h>
#include <math.h>
/*
* int2bin
*
* 将一个unsigned char类型的整数(0~255)转化为一个二进制数组
*
* @param unsigned char intValue 要转化的整数
* @param int *binArray 指向二进制数组的指针
* @param int n 要转化成的二进制数组的元素个数 
* @return void
*/
void int2bin(unsigned char intValue,unsigned char *binArray,int n) {
    unsigned char divValue;
    unsigned char modValue;
    int index = n-1;
    //binArray = (char *)malloc(sizeof(char)*8);//函数内部不能申请初址
    //binArray[8] = {};
    divValue = intValue/2;
    modValue = intValue%2;
    binArray[index] = modValue;
    while(divValue!=0) {
        modValue = divValue%2;
        binArray[--index] = modValue;
        divValue/=2;
    }
}

unsigned char bin2int(char *bin,int binSize) {
    int i,j;
    unsigned char intValue = 0;
    
    for(i=binSize-1,j=0;i>=0;i--,j++) {
        intValue += (bin[i] * pow(2,j));    
    }
    return intValue;
}
int main() {
    FILE *fr,*fw;
    unsigned char dataFromFile[8] = {0};//8*8=64位的数据,每个元素为一个字节
    unsigned char dateEncode[8] = {0};//加密后的字节 
    unsigned char binArray[64] = {0};//64位二进制数据,作为明文
    int i,j;
    /*
    int test = 255;
    char testBin[8] = {0};
    */
    
    if ((fr=fopen("read.txt","rb"))==NULL) {
        printf("can not open read.txt for read\n");
        return -1;
    }
    if ((fw=fopen("write.txt","wb"))==NULL) {
        printf("can not open write.txt for write\n");
        return -2;
    }
    
    while (fread(dataFromFile,sizeof(char),8,fr)) {
        if (num<8) {
            for (i=num;i<8;i++) {
                dataFromFile[i] = 0;
            }        
        }        
        for (i=0;i<8;i++) {
            printf("%d ",dataFromFile[i]);
            int2bin(dataFromFile[i],binArray+i*8,8);
        }
        printf("\n");
        for (i=0;i<8;i++) {
            dateEncode[i] = bin2int(binArray+i*8,8);
            printf("%d ",dateEncode[i]);
        }
        printf("\n");
        fwrite(dateEncode,sizeof(char),8,fw);
    }
    
    fclose(fr);
    fclose(fw);
    /*
    int2bin(test,testBin,8);
    for (i=0;i<8;i++) {
        printf("%d ",testBin[i]);
    }
    printf("\n");
    test = bin2int(testBin,8);
    printf("%d \n",test);
    */
    
    return 0;
}
[/code]
上面的是源码,本想着,经过我把十进制转化为二进制,再把二进制转化为十进制后,结果回事一样的,但是事与愿违,看了好久,没有发现错误。贴出来和大家一起商量。
我的思路是这样的,我本想讲文件加密,发现加密的过程出现了问题,第一加密、解密是正确的,以后的内容解密出来后都是乱码。我的单次加解密是正确的。怀疑在读写文件的时候出了问题。于是我把读写文件的内容单独摘了出来,如上面所示。
文件的操作过程是这样的,先用fread读取8个char类型的数字,然后将每一个数字转化为8个由0或者1组成的数组,最终形成一个8*8=64个元素的数组,然后对这个64位的明文进行加密和解密(在源代码中省略了,源码给出的是没有经过加解密的数据),然后将这个64位的数组进行转化,每8位转化成一个char类型的数字,结果发现转化后的数字跟原来读取出来的数字不一样,特别是在遇到回车符的时候,肯定出错。
请填写代码

回复列表 (共1个回复)

沙发

深圳市华信群英科技有限公司与知名通信软件公司正式签订定向输送人才的合作协议
针对想进入IT软件行业的有志人士提供专业的企业内训
实训课程采用“2+3”分段教学模式,分为2个月理论强化和3个月项目实训两个阶段
实训前就签订就业安置协议,岗前实训后入职
不仅学费优惠而且是企业定向培训定向招聘,百分百保证就业
有意向请登录www.szctt.com,或加QQ:1179397962做详细咨询

我来回复

您尚未登录,请登录后再回复。点此登录或注册