对字符求和并减去得到文件
Sum chars and subtract to get file
我正在编写一个程序,用一个随机数对文件中的一个字符求和,然后再减去该文件。
问题是当我对它们求和并相减时,生成的文件不一样。
可能是我的数学不好或者我对字符不了解。
求和代码(已编辑):
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(已编辑)*********
字符数组声明:
int num[9999]
int buf[9999]
int rdn[9999]
GetRandom_Soft()
returns char
,取值范围是[-128;127],你尝试赋值范围是[0;127] 255] - 无法正常工作。
我也怀疑你在这里做类似的事情:
buf[i] = buf[i] + rdn;
这里:
buf[i] = buf[i] - num[i];
我怀疑 buf
或 num
或两者的类型与 char*
不同(例如 unsigned char*
) AND/OR 加法或减法的结果超出了 char
值范围,这会破坏结果。
编辑
更新后几乎可以肯定是 unsigned char
溢出的问题。 unsigned char
从范围 [0;255] 中获取值 - 如果加法结果 > 255 或减法结果 < 0,那么你将得到错误的结果。对于您的数字,将这些值解释为 int
似乎更有意义。
我正在编写一个程序,用一个随机数对文件中的一个字符求和,然后再减去该文件。
问题是当我对它们求和并相减时,生成的文件不一样。
可能是我的数学不好或者我对字符不了解。
求和代码(已编辑):
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(已编辑)*********
字符数组声明:
int num[9999]
int buf[9999]
int rdn[9999]
GetRandom_Soft()
returns char
,取值范围是[-128;127],你尝试赋值范围是[0;127] 255] - 无法正常工作。
我也怀疑你在这里做类似的事情:
buf[i] = buf[i] + rdn;
这里:
buf[i] = buf[i] - num[i];
我怀疑 buf
或 num
或两者的类型与 char*
不同(例如 unsigned char*
) AND/OR 加法或减法的结果超出了 char
值范围,这会破坏结果。
编辑
更新后几乎可以肯定是 unsigned char
溢出的问题。 unsigned char
从范围 [0;255] 中获取值 - 如果加法结果 > 255 或减法结果 < 0,那么你将得到错误的结果。对于您的数字,将这些值解释为 int
似乎更有意义。