【问题标题】:Sum chars and subtract to get file对字符求和并减去以获取文件
【发布时间】:2017-07-10 08:58:59
【问题描述】:

我正在编写一个程序,用随机数对文件中的字符求和,然后减去以再次获取文件。

问题是当我将它们相加和相减时,得到的文件不一样。

可能是我的数学不好或我对字符一无所知。

求和代码(已编辑):

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 = 指向具有filenamefilename_n 和的文件的文件指针

*********更新2(已编辑)*********

chars数组的声明:

int num[9999]

int buf[9999]

int rdn[9999]

【问题讨论】:

标签: c++ char fopen


【解决方案1】:

GetRandom_Soft()返回char,其取值范围为[-128;127],你尝试从[0]范围内赋值255] - 无法正常工作。

我也怀疑你在这里做类似的事情:

buf[i] = buf[i] + rdn;

这里:

buf[i] = buf[i] - num[i];

我怀疑bufnum 或两者都属于与char* 不同的类型(例如unsigned char*AND/OR 加法或减法的结果在外面破坏结果的char 值范围。

编辑

更新后,几乎可以肯定是unsigned char 溢出的问题。 unsigned char 取值范围 [0;255] - 如果加法的结果 > 255 或减法的结果 int 似乎更有意义。

【讨论】:

  • 很高兴知道这一点!但我尝试将unsigned 添加到字符声明中,但这并不能解决问题,但更符合逻辑,所以我添加并更新了问题。
  • 如果减法 ,则加 255
  • 如果你继续使用 unsigned char,你将无法检测到 sum 255。结果将被转换为 unsigned char,所以它仍然在范围内[0;255]。阅读本主题以获得更好的理解:stackoverflow.com/questions/21530358/… 只需使用整数,除非您的数字很大,否则您不必担心您的值范围。
  • 所以我不能将unsigned char 用于任何字符声明,对吧?使用int更好吗?
  • 好的,使用int 代替unsigned char 几乎可以了,我现在可以看到原始字符的一部分,但很少
猜你喜欢
  • 2022-02-03
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
相关资源
最近更新 更多