C ++:将char转换为int时获取随机负值 [英] C++: Getting random negative values when converting char to int
问题描述
当我尝试将char从文件读取的字符串转换为int时,为什么会得到负值?
Why do I get negative values when I'm trying to convert chars from the string read from file to int?
fin.getline(text, 512);
fin.close();
someInt = (int)text[0]; // It happens to be the random value and always negative.
全码:
问题本身在解密功能中. 当我从文件中读取字符串并将字符从该字符串转换为int时,即使字符相同,我也会得到负值,并且总是随机的.
The problem itself is in the Decrypt function. When I read the string from file, and convert chars from that string to int, i get negative values, always random, even if characters are the same.
// WUEncryptor.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
void Encrypt(string filePath, string password = "");
void Decrypt(string filePath, string password = "");
int main(int argc, char** argv)
{
int mode = 0;
string filePath;
if (argc > 2) {
mode = atoi(argv[1]);
filePath = argv[2];
/** Checking which mode to use */
switch (mode) {
case 0:
if (argc > 3)
Encrypt(filePath, argv[3]);
else
Encrypt(filePath);
break;
case 1:
if (argc > 3)
Decrypt(filePath, argv[2]);
else
Decrypt(filePath);
break;
default:
return 0;
}
}
else {
/** If something was entered wrong by user, print the error message and quit */
cout << "Invalid launch..\nYou should use arguments\nFor example: \"WUEncryptor 0 EncryptedFile\n";
}
return 0;
}
/** Encrypting function */
void Encrypt(string filePath, string password) {
string text;
string pass = password;
/** Quit if pass word isn't determined */
if (pass == "") {
cout << "Use \"WUEncryptor 0/1 \"filepath\" password\n";
return;
}
cout << "Enter the message which is going to be encrypted\n";
char tempstr[512];
gets_s(tempstr);
text = tempstr;
/** Loop that replaces characters in the text */
for (int i = 0, m = 0, temp = 0; i < text.length(); i++) {
temp = (int)text[i] + (int)pass[m];
cout << temp;
if (temp > 255)
temp -= 256;
cout << temp;
text[i] = (char)temp;
/** Looping the pass code */
if (m >= pass.length() - 1)
m = 0;
else
m++;
cout << "Encrypting " << i << " of " << text.length() << "...\n";
}
cout << "Successfully encrypted\nTEXT: " << text << '\n';
ofstream fout;
try {
filePath += ".encrypted";
cout << "Creating the file...\n";
fout.open(filePath, ios_base::trunc);
cout << "Writing to file...\n";
fout << text;
fout.close();
cout << "We're all set!\n";
system("pause");
}
catch (exception) {
cout << "Something went wrong";
}
}
/** Decrypting function */
void Decrypt(string filePath, string password) {
string text, pass;
pass = password;
ifstream fin;
/** Quit if pass word isn't determined */
if (pass == "") {
cout << "Use \"WUEncryptor 0/1 \"filepath\" password\n";
return;
}
string openPath = filePath + ".encrypted";
char tempstr[512];
try {
fin.open(openPath);
fin.getline(&tempstr[0], 512);
fin.close();
text = tempstr;
//cout << (int)text[1];
for (int i = 0, m = 0, temp = 0; i < text.length(); i++) {
temp = (int)text[i] - (int)pass[m];
cout << temp;
if (temp < 0)
temp += 256;
cout << temp;
text[i] = (char)temp;
/** Looping the pass code */
if (m >= pass.length() - 1)
m = 0;
else
m++;
cout << "Decrypting " << i << " of " << text.length() << "...\n";
}
cout << "Successfully decrypted\nTEXT: " << text << '\n';
}
catch (exception) {}
ofstream fout;
try {
string savePath = filePath + ".txt";
cout << "Creating the file...\n";
fout.open(savePath, ios_base::trunc);
cout << "Writing to file...\n";
fout << text;
fout.close();
cout << "We're all set!\n";
system("pause");
}
catch (exception) {
cout << "Something went wrong";
}
}
有人,请清除我的主意:D
Someone, clear my mind :D
推荐答案
您可能正在使用char*
作为text
的数据类型.
请注意,char
是带符号的,因此(如果您认为)的值例如为200
确实是-72
,因此,如果将其转换为int
,则会得到-72
:)
You're probably using char*
as datatype for text
.
Note that char
is signed, so if you (think you) have a value of e.g. 200
there, it's really -72
, and so if you cast that to int
, you get -72
:)
这篇关于C ++:将char转换为int时获取随机负值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!