加密时文件末尾出现奇怪的字符
Weird characters appear at the end of file when encrypting it
我从没想过我必须求助于 SO 来解决这个问题。
好吧,为了更深入地了解我正在制作自己的加密程序。
我并不想让它变得更好或任何它只是一个个人项目。
该程序正在做的是翻转字符的每个字节中的某些位,使其不可读。
然而,每次我 运行 程序和解密时,我都会在输出中得到奇怪的字符。这些字符似乎与以下行数匹配:
^^ 我要加密的文本
^^ 加密后。 (很多文字被截断了)
^^解密后。有 10 个空字符对应于换行符的数量。似乎还有另一个奇怪的“?”字符。这些字节来自哪里??
我已经尝试了很多东西。这是我的代码,如果有人需要的话(它是用默认标志编译的):
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#define ENCRYPTFILE "Encrypted.oskar"
typedef unsigned char BYTE;
char saltFunc(BYTE salt, char chr) {
for(int i = 0; i < 8; i++) {
if((salt >> i) & 1U) {
chr ^= 1UL << i;
}
}
return chr;
}
int main () {
std::ofstream encryptFile(ENCRYPTFILE, std::ifstream::in);
std::ifstream inputFile(ENCRYPTFILE, std::ifstream::in);
unsigned int length;
unsigned int lineLength;
BYTE salt = 0b00000001;
std::string line;
std::cin.unsetf(std::ios::dec);
std::cin.unsetf(std::ios::hex);
std::cin.unsetf(std::ios::oct);
//std::cout << "input salt in hex with a prefix 0x so for example. 0xA2" << std::endl;
//std::cin >> std::hex >> salt;
inputFile.seekg(0, inputFile.end);
length = inputFile.tellg();
inputFile.seekg(0, inputFile.beg);
std::cout << lineLength << std::endl;
char* fileBuffer = new char[length];
char* encryptFileBuffer = new char[length];
memset(fileBuffer, 0, length);
memset(encryptFileBuffer, 0, length);
while (inputFile.good()) { // just get file length in bytes.
static int i = 0;
fileBuffer[i] = inputFile.get();
i++;
}
while (std::getline(inputFile, line))
++lineLength;
inputFile.clear();
encryptFile.clear();
std::cout << "file size: " << length << std::endl;
for(int i = 0; i < length; i++) {
encryptFileBuffer[i] = saltFunc(salt, fileBuffer[i]);
encryptFile << encryptFileBuffer[i];
}
inputFile.close();
encryptFile.close();
delete[] encryptFileBuffer;
delete[] fileBuffer;
return 0;
}
问题是您正在测量 字节 的文件长度,对于文本文件,这与 个字符的长度不同。但是您随后将其作为字符读取,因此您最终读取了太多字符,然后在输出文件结束后写入了额外的垃圾。
由于每行多了一个字符,很可能您在 Windows 上 运行,其中行结束字符是文件中的两个字节。这就是您看到的额外不正确长度的来源。
对于 encryption/decryption 你可能想要做的是以 binary 模式读写文件,所以你正在读写 bytes 不是 个字符 。您可以通过在打开文件时将 std::ios::binary
添加到标志中来执行此操作:
std::ofstream encryptFile(ENCRYPTFILE, std::ifstream::in | std::ios::binary);
std::ifstream inputFile(ENCRYPTFILE, std::ifstream::in | std::ios::binary);
我从没想过我必须求助于 SO 来解决这个问题。
好吧,为了更深入地了解我正在制作自己的加密程序。 我并不想让它变得更好或任何它只是一个个人项目。 该程序正在做的是翻转字符的每个字节中的某些位,使其不可读。
然而,每次我 运行 程序和解密时,我都会在输出中得到奇怪的字符。这些字符似乎与以下行数匹配:
^^解密后。有 10 个空字符对应于换行符的数量。似乎还有另一个奇怪的“?”字符。这些字节来自哪里??
我已经尝试了很多东西。这是我的代码,如果有人需要的话(它是用默认标志编译的):
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#define ENCRYPTFILE "Encrypted.oskar"
typedef unsigned char BYTE;
char saltFunc(BYTE salt, char chr) {
for(int i = 0; i < 8; i++) {
if((salt >> i) & 1U) {
chr ^= 1UL << i;
}
}
return chr;
}
int main () {
std::ofstream encryptFile(ENCRYPTFILE, std::ifstream::in);
std::ifstream inputFile(ENCRYPTFILE, std::ifstream::in);
unsigned int length;
unsigned int lineLength;
BYTE salt = 0b00000001;
std::string line;
std::cin.unsetf(std::ios::dec);
std::cin.unsetf(std::ios::hex);
std::cin.unsetf(std::ios::oct);
//std::cout << "input salt in hex with a prefix 0x so for example. 0xA2" << std::endl;
//std::cin >> std::hex >> salt;
inputFile.seekg(0, inputFile.end);
length = inputFile.tellg();
inputFile.seekg(0, inputFile.beg);
std::cout << lineLength << std::endl;
char* fileBuffer = new char[length];
char* encryptFileBuffer = new char[length];
memset(fileBuffer, 0, length);
memset(encryptFileBuffer, 0, length);
while (inputFile.good()) { // just get file length in bytes.
static int i = 0;
fileBuffer[i] = inputFile.get();
i++;
}
while (std::getline(inputFile, line))
++lineLength;
inputFile.clear();
encryptFile.clear();
std::cout << "file size: " << length << std::endl;
for(int i = 0; i < length; i++) {
encryptFileBuffer[i] = saltFunc(salt, fileBuffer[i]);
encryptFile << encryptFileBuffer[i];
}
inputFile.close();
encryptFile.close();
delete[] encryptFileBuffer;
delete[] fileBuffer;
return 0;
}
问题是您正在测量 字节 的文件长度,对于文本文件,这与 个字符的长度不同。但是您随后将其作为字符读取,因此您最终读取了太多字符,然后在输出文件结束后写入了额外的垃圾。
由于每行多了一个字符,很可能您在 Windows 上 运行,其中行结束字符是文件中的两个字节。这就是您看到的额外不正确长度的来源。
对于 encryption/decryption 你可能想要做的是以 binary 模式读写文件,所以你正在读写 bytes 不是 个字符 。您可以通过在打开文件时将 std::ios::binary
添加到标志中来执行此操作:
std::ofstream encryptFile(ENCRYPTFILE, std::ifstream::in | std::ios::binary);
std::ifstream inputFile(ENCRYPTFILE, std::ifstream::in | std::ios::binary);