【问题标题】:String or file entropy [closed]字符串或文件熵[关闭]
【发布时间】:2018-01-08 18:23:58
【问题描述】:

我正在尝试编写字符串\文件熵计算器。这是我写的代码,但它不起作用:

double entropy(char* buf)
{
    int*   rgi = (int*)_alloca(256);
    int*   pi  = rgi + 256;
    double H   = 0.0;
    double cb  = sizeof(buf);

    for (int i = sizeof(buf); --i >= 0;)
    {
        rgi[buf[i]]++;
    }

    while (--pi >= rgi)
    {
        if (*pi > 0)
        {
            H += *pi * log2(*pi / cb);
        }
    }

    return -H / cb;
}

我做错了什么?

【问题讨论】:

标签: c entropy


【解决方案1】:

我认为你有 4 个问题

1) 分配的内存从不初始化

2) 分配的内存太少,因为每个整数只分配 1 个字节

3) 将char 用于buf 可能是一个问题,因为char 可能已签名

4) sizeof(buf) 给你一个字符指针的大小,但不是缓冲区的大小

此外,我认为您通过向后迭代使代码过于复杂。

试试这个:

double entropy(unsigned char* buf, size_t bufsize)
{
    int*   rgi = (int*)_alloca(256 * sizeof *rgi);
    memset(rgi, 0, 256 * sizeof *rgi);
    double H   = 0.0;
    double cb  = bufsize;

    for (size_t i = 0; i < bufsize; ++i)
    {
        rgi[buf[i]]++;
    }

    for (int i = 0; i < 256; ++i)
    {
        if (rgi[i] > 0)
        {
            H += rgi[i] * log2(rgi[i] / cb);
        }
    }

    return -H / cb;
}

【讨论】:

  • 非常感谢您的解释。您的代码适用于文件,但返回的字符串值不正确。例如,char str[] = "1223334444"; printf("%.3f\n", entropy(str, sizeof(str)); 返回超过 2.xxx 的值,但正确的值为 1.846。
  • @JimDawson - 那是因为您错误地调用了该函数。 sizeof(str) 是错误的。请改用strlen(str)sizeof 将包含字符串终止,而 strlen 不包含。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多