我正在制作一个程序,用一个随机数的文件对一个字符求和,然后减去再次得到该文件。
问题是当我对它们求和并减去时,结果文件不一样。
可能是糟糕的数学我或者我不了解的字符。
总和(编辑)代码:
while (!feof(filename))
{
size_t read = fread(&buf, sizeof(char), max_array, filename);
for (unsigned long long i = 0; i < read; i++)
{
unsigned char rdn = GetRandom_Soft();
/*
if (buf[i] + rdn > 255) buf[i] = (buf[i] + rdn) - 255;
else buf[i] = buf[i] + rdn;
*/
buf[i] = buf[i] + rdn;
num[i] = rdn;
}
fwrite(&num, sizeof(char), read, filename_n);
fwrite(&buf, sizeof(char), read, filename2);
}
代码GetRandom()
(已编辑):
int GetRandom_Soft()
{
return rand() % 256;
}
要减去(编辑)的代码:
while (!feof(filename2))
{
size_t read_c = fread(&num, sizeof(char), max_array, filename_n);
fread(&buf, sizeof(char), max_array, filename2);
for (unsigned long long i = 0; i < read_c; i++)
{
buf[i] = buf[i] - num[i];
/*
if(buf[i] - num[i] < 0) buf[i] = (buf[i] - num[i]) +255;
else buf[i] = buf[i] - num[i];
*/
}
fwrite(&buf, sizeof(char), read_c, filename);
}
*********更新1 *********
filename
=指向原始文件的文件指针
filename_n
=文件指向带有数字
filename2
=指向文件的指针,其总和为filename
和filename_n
********更新2(已编辑)*********
chars数组声明:
int num[9999]
int buf[9999]
int rdn[9999]
答案 0 :(得分:2)
GetRandom_Soft()
返回char
,其值范围为[-128; 127],并尝试分配范围[0; 255] - 不能正常工作。
我也怀疑你在这里做类似的事情:
buf[i] = buf[i] + rdn;
在这里:
buf[i] = buf[i] - num[i];
我怀疑buf
或num
或两者的类型与char*
不同(例如unsigned char*
)和/或结果加法或减法的范围超出char
值范围,这会破坏结果。
修改强>
更新后几乎肯定是unsigned char
溢出的问题。 unsigned char
从范围[0; 255]获取值 - 如果您添加的结果是&gt; 255或减法的结果是&lt; 0,比你得到错误的结果。似乎将值解释为int
在您的数字的情况下更有意义。