2

ファイルからテキストを読み取り、パスワードを引数として取り、入力文字列と同じ長さの文字列を作成し、文字ごとの 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 文字の前後で終了します。おそらく長さが関係して、ヌル文字がプロセスを通過する方法はありますか? 長文失礼しました、ありがとうございました!

4

3 に答える 3

2

文字列ではない char 配列で「文字列」関数を使用することはできません。他の方法でその内容を印刷する必要があります。

printf("encoded:");
for (int k = 0; k < length; k++) {
    printf(" %02x", encodedString[k]);
}
printf("\n");
于 2014-09-08T08:34:56.333 に答える
1

'\0' ascii(0)(char)0は同じで、すべて文字列を終了します。

データに埋め込まれた文字を処理できるようにしたい場合'\0'は、別の変数で長さを追跡する必要があり、文字列関数に依存することはできません。

あなたの場合、出力ルーティングを変更する必要があります。

//fprintf(fpo, "%s", encodedString);  // Doesn't work with embedded '\0' characters
fwrite(fpo, encodedString, length);   // Works with embedded '\0' characters

一部のテキスト エディタでは、埋め込まれ'\0'た .

于 2014-09-08T08:40:32.023 に答える