为什么unsigned char变量包含EOF?

时间:2017-05-15 11:57:05

标签: c eof

我开发了一种加密算法,它通过.txt文件中的字符文本获取字符并对其进行加密,然后将其写回另一个.txt文件。问题是当我读取加密文件时,像箭头符号这样的字符充当EOF,我的循环在原始EOF之前终止。这是我的代码:

static void ECB_ENCRYPTION(void)
{
    uint8_t i = 0, j = 0, c, buf1[16]


    uint8_t plain_text[16];

    // File pointers for file operations.
    FILE *f, *f1;


    // Encrypts the file [plaintext.txt].
    f = fopen("plaintext.txt", "r");
    f1 = fopen("ciphertext.txt", "w");
    while(1)
    {
        i = 0;
        while(i < 16)
        {
            c = getc(f);
            if(feof(f))
            {
                break;
            }
            else
            {
                plain_text[i] = c;
                ++i;
            }
        }

        if(i != 16)
        {
            while(i < 16)
            {
                plain_text[i] = ' ';
                ++i;
            }
        }

        // Encrypts plain text.
        AES128_ENCRYPT(plain_text, buf1);

        i = 0;
        while(i < 16)
        {
            putc(buf1[i], f1);
            ++i;
        }

        if(feof(f))
            break;

    }

    fclose(f);
    fclose(f1);
}

static void ECB_DECRYPTION(void)
{

    uint8_t i = 0, j = 0, c, buf1[16];

    uint8_t cipher_text[16];

    // File pointers for file operations.
    FILE *f, *f1;

    // Encrypts the file [plaintext.txt].
    f = fopen("ciphertext.txt", "r");
    f1 = fopen("decryptedtext.txt", "w");
    while(1)
    {
        i = 0;
        while(i < 16)
        {
            c = getc(f);
            if(feof(f))
            {
                break;
            }
            else
            {
                cipher_text[i] = c;
                ++i;
            }
        }

        if(feof(f))
            break;

        // Decrypts cipher text.
        AES128_DECRYPT(cipher_text, buf1);

        i = 0;
        while(i < 16)
        {
            putc(buf1[i], f1);
            ++i;
        }

    }

    fclose(f);
    fclose(f1);
}

2 个答案:

答案 0 :(得分:0)

这是因为加密的ascii字符可以获得任何二进制表示,包括nul,EOF,^ Z等等。因此,您生成的加密文件不再是文本文件。它现在是一个二进制文件。

因此,在创建加密文件时,请使用function shuffle(a) { for (let i = a.length; i; i--) { let j = Math.floor(Math.random() * i); [a[i - 1], a[j]] = [a[j], a[i - 1]]; } } 将其打开,然后在阅读时,使用"wb"将其打开。此外,使用二进制函数来编写("rb")和读取(fwrite),而不是freadfputc

答案 1 :(得分:0)

int c而非int c的使用模糊了真正的问题:以二进制与文本模式打开文件。 @Klas Lindbäck

uint8_t; c = getc(f); if(feof(f))本来会更好。 OP对static void ECB_DECRYPTION(void) { uint8_t cipher_text[16]; uint8_t buf1[16]; FILE *f = fopen("ciphertext.txt", "rb"); // add 'b' assert(f); FILE *f1 = fopen("decryptedtext.txt", "wb"); // add 'b' assert(f1); while(1) { int c; for (unsigned i=0; i<16; i++) { c = getc(f); if (c == EOF) break; cipher_text[i] = (uint8_t) c; } if(c == EOF) break; // exit loop on end-of-file or input error AES128_DECRYPT(cipher_text, buf1); for (unsigned i=0; i<16; i++) { putc(buf1[i], f1); } } fclose(f); fclose(f1); } 的使用仍然几乎正确。发生读取错误时失败。

class OriginalViewController: UIViewController, UIPopoverPresentationControllerDelegate