ファイルからテキストを読み取り、パスワードを引数として取り、入力文字列と同じ長さの文字列を作成し、文字ごとの XOR 演算を実行して、エンコードされたテキストを出力する C でプログラムを作成しています。別のファイルに変換し、同じプロセスで元に戻すことができます。私の問題は次のとおりです。文字 XOR 自体が ASCII ヌル文字であるため、どこかで読み書きに問題が発生しています。ASCII 0 が EOF、'\0'、またはその両方として読み取られるかどうかはわかりません。私のコードの入力部分は次のようになります。
int main(int argc, char *argv[])
{
if(argv[1]==NULL) /*makes sure there is an input and password, respectively*/
return 1;
if(argv[2]==NULL)
return 2;
FILE *fpi = fopen(argv[1],"rb");
char *inputText;
fseek(fpi, 0L, SEEK_END); /*finds end of file, reads size, and then sets to beginning of stream*/
int fileSize = ftell(fpi);
fseek(fpi, 0L, SEEK_SET);
inputText = malloc(fileSize+1);
size_t size=fread(inputText,1,fileSize,fpi);
inputText[size]=0;
fclose(fpi);
私の出力セクションは次のようになります。
char *encodedString = xorString(plainText, passwordCode, textLength, twoToThe); /*call to xor function*/
FILE *fpo;
if(argv[3]!=NULL)
{
fpo = fopen(argv[3],"w");
}
else
{
fpo = fopen(OUTPUT_FILE,"w");
}
fprintf(fpo, "%s", encodedString);
fclose(fpo);
return 0;
私の XOR 関数は次のようになります。
char *xorString(char *plainString, char * passString, int length, int *powsOfTwo)
{
char *codedString = malloc((sizeof (char)) * length + 1);
int i;
for(i=0; i<length; i++)
{
codedString[i] = plainString[i] ^ passString[i];
}
return codedString;
}
これは、私のエンコーディング ファイルが「I like books!」の場合に問題になります。私のパスワードは「foo」です。
I ^ f = /
^ o = 0
l ^ o = (ASCII 3)
i ^ f = (ASCII 15)
k ^ o = (ASCII 4)
e ^ o = '\n'(ASCII 10)
^ f = F
b ^ o = '\r'(ASCII 13)
o ^ o = (ASCII 0)!!!!!!
o ^ f = (ASCII 9)
k ^ o = (ASCII 4)
s ^ o = (ASCII 28)
! ^ f = G
この例では、出力ファイルに F が表示されますが、G は表示されません。つまり、null 文字の前後で終了します。おそらく長さが関係して、ヌル文字がプロセスを通過する方法はありますか? 長文失礼しました、ありがとうございました!