C 手册;“加密”;仅输出0';要归档的文件

C 手册;“加密”;仅输出0';要归档的文件,c,file,file-io,bitwise-operators,C,File,File Io,Bitwise Operators,我的任务(不是家庭作业,只是“如果你能做到这一点就试试”)是使用位操作来加密和解密.txt文件 这是节目。它成功打开文件进行读/写操作,但将所有0和空格放入output.txt文件,而不是预期的“加密”文本。我猜这个问题来自于对数据类型或putc()的根本误解。我知道它会输出一个无符号字符,但我的教授说,无符号字符只不过是一个无符号int,不确定这是真的还是教学上的简化。非常感谢你的帮助 #include <stdio.h> #include <ctype.h> #inc

我的任务(不是家庭作业,只是“如果你能做到这一点就试试”)是使用位操作来加密和解密.txt文件

这是节目。它成功打开文件进行读/写操作,但将所有0和空格放入output.txt文件,而不是预期的“加密”文本。我猜这个问题来自于对数据类型或putc()的根本误解。我知道它会输出一个无符号字符,但我的教授说,无符号字符只不过是一个无符号int,不确定这是真的还是教学上的简化。非常感谢你的帮助

#include <stdio.h>
#include <ctype.h>
#include <string.h>

#define NUMARG 3
#define INFILEARG 1
#define OUTFILEARG 2

int main(int argc, char *argv[]){
    /* Function prototypes */
    unsigned int encryptDecrypt(unsigned int x, unsigned int ed);
    const char *get_filename_ext(const char *filename);

    FILE *finp;
    FILE *foutp;

    //ed for encryption/decryption choice
    unsigned int ed, c;
    const char *ext;

    //Check for errors in argument number and file opening.
    if(argc != NUMARG){
        printf("You have to put the input and output files after the 
                program name.\n");
        return(1);
    }

    if( (finp = fopen(argv[INFILEARG], "r")) == NULL ){
         printf("Couldn't open %s for reading.\n", argv[INFILEARG]);
         return(1);
    }

    if( (foutp = fopen(argv[OUTFILEARG], "w")) == NULL){
        printf("Couldn't open %s for writing.\n", argv[OUTFILEARG]);
        return(1);
    }


    //Get and check file extension.
    ext = get_filename_ext(argv[INFILEARG]);
    if(strcmp(ext, "txt")){
        printf("Input file is not a .txt file.\n");
        return(1);
    }

    ext = get_filename_ext(argv[OUTFILEARG]);
    if(strcmp(ext, "txt")){
        printf("Output file is not a .txt file.\n");
        return(1);
    }

    //Get command to encrypt or decrypt.
    do{
        printf("Enter e to encrypt, d to decrypt: ");
        ed = getchar();
    } while(ed != 'e' && ed != 'd');


    //Send characters to output file.
    while((c = getc(finp)) != EOF ){
         putc(encryptDecrypt(c, ed), foutp);
    }


    // Close files.
    if (fclose(finp) == EOF){
         printf("Error closing input file.\n");
    }

    if (fclose(foutp) == EOF){
        printf("Error closing output file.\n");
    }

    if ( ed == 'e'){
        printf("Encrypted data written.\n");
    } else {
         printf("Data decrypted.\n");
    }

    return 0;
}

const char *get_filename_ext(const char *filename) {
    const char *dot = strrchr(filename, '.');
    if(!dot || dot == filename) return "";
    return dot + 1;
}

unsigned int encryptDecrypt(unsigned int c, unsigned int ed){
    if( ed == 'e' ){
        printf("%d before operated on.\n", c);
        c &= 134;
        printf("%d after &134.\n", c);
        c ^= 6;
        printf("%d after ^6. \n", c);
        c <<= 3; 
        printf("%d after <<3\n", c);
    }
    else {
        c >>= 3;
        c ^= 6;
        c &= 134;       
    }   
    return c;
}
#包括
#包括
#包括
#定义NUMARG 3
#定义内嵌1
#定义出料口arg 2
int main(int argc,char*argv[]){
/*功能原型*/
无符号整数加密解密(无符号整数x,无符号整数);
常量字符*获取文件名\外部(常量字符*文件名);
文件*finp;
文件*foutp;
//加密/解密选择的ed
无符号整数,c;
常量字符*ext;
//检查参数编号和文件打开是否有错误。
如果(argc!=NUMARG){
printf(“您必须将输入和输出文件放在
程序名。\n“;
申报表(1);
}
if((finp=fopen(argv[infiearg],“r”))==NULL){
printf(“无法打开%s进行读取。\n”,argv[infiearg]);
申报表(1);
}
if((foutp=fopen(argv[outfielarg],“w”))==NULL){
printf(“无法打开%s进行写入。\n”,argv[OUTFILEARG]);
申报表(1);
}
//获取并检查文件扩展名。
ext=get_filename_ext(argv[infiearg]);
if(strcmp(分机,“txt”)){
printf(“输入文件不是.txt文件。\n”);
申报表(1);
}
ext=get_filename_ext(argv[OUTFILEARG]);
if(strcmp(分机,“txt”)){
printf(“输出文件不是.txt文件。\n”);
申报表(1);
}
//获取用于加密或解密的命令。
做{
printf(“输入e进行加密,输入d进行解密:”);
ed=getchar();
}while(ed!=“e”&&ed!=“d”);
//将字符发送到输出文件。
而((c=getc(finp))!=EOF){
putc(加密解密(c,ed),foutp);
}
//关闭文件。
如果(fclose(finp)=EOF){
printf(“关闭输入文件时出错。\n”);
}
如果(fclose(foutp)=EOF){
printf(“关闭输出文件时出错。\n”);
}
如果(ed='e'){
printf(“加密数据写入。\n”);
}否则{
printf(“数据已解密。\n”);
}
返回0;
}
常量字符*获取文件名\外部(常量字符*文件名){
const char*dot=strrchr(文件名“.”);
如果(!dot | | dot==文件名)返回“”;
返回点+1;
}
无符号整数加密解密(无符号整数c,无符号整数c){
如果(ed='e'){
printf(“%d在操作之前。\n”,c);
c&=134;
printf(“%d在&134之后。\n”,c);
c^=6;
printf(“^6后面的%d.\n”,c);
c=3;
c^=6;
c&=134;
}   
返回c;
}
输出:

ZacBook:bitoperations $ cat input1.txt
Please encrypt this message.
ZacBook:bitoperations $ ./encrypt.o input1.txt output.txt
Enter e to encrypt, d to decrypt: e
80 before operated on.
0 after &134.
6 after ^6. 
48 after <<3
108 before operated on.
4 after &134.
2 after ^6. 
16 after <<3
[...Many more of these debug lines]
2 after &134.
4 after ^6. 
32 after <<3
Encrypted data written.
ZacBook:bitoperations $ cat output.txt
00 0  00000 0  0 
ZacBook:bitcomperations$cat input1.txt
请加密此邮件。
ZacBook:bitoperations$./encrypt.o input1.txt output.txt
输入e进行加密,输入d进行解密:e
手术前80分钟。
在&134之后为0。
^6之后的6。

48在之后,您的主要问题是
&=
是一种有损转换:即丢失数据

同上,因为两者都会导致极端1位丢失

您将有更多的运气坚持异或;至少一开始是这样。那是因为
x^y^y
x


您可以消除
putc
&c。通过将加密/解密过程与数据采集阶段隔离,并在工作时对输入进行硬编码。

您的主要问题是
&=
是一种有损转换:即丢失数据

同上,因为两者都会导致极端1位丢失

您将有更多的运气坚持异或;至少一开始是这样。那是因为
x^y^y
x


您可以消除
putc
&c。通过将加密/解密过程与数据采集阶段隔离,并在工作时对输入进行硬编码。

不要在
main
while((c=getc(finp))!=EOF)中对函数进行原型化
--
unsigned int c
可能无法保持
EOF
@AjayBrahmakshatriya我认为
EOF
将转换为unsigned,并且可以正常工作。@EugeneSh:你确实是对的<代码>EOF
将转换为
无符号
@EugeneSh。是的,我同意它很好用。但不建议这样做。不要在((c=getc(finp))!=EOF)时在
main
中原型函数--
unsigned int c
可能无法保持
EOF
@AjayBrahmakshatriya我认为
EOF
将转换为unsigned,并且工作正常。@EugeneSh.:你确实是正确的<代码>EOF
将转换为
无符号
@EugeneSh。是的,我同意它很好用。但不建议这样做。谢谢。我设法让它只与XOR一起工作。然而,我的印象是不,XOR在模式中引入了1位。啊,是的。我试着在XOR之后左移,但是所有的字符都变成了它们的命令版本——即^P^L^e^A^S^e^e^N^C^R^Y^P^T…谢谢。我设法让它只与XOR一起工作。然而,我的印象是不,XOR在模式中引入了1位。啊,是的。我尝试在XOR后左移,但所有的字符都变成了它们的命令版本——即^P^L^e^A^S^e^e^N^C^R^Y^P^T。。。