从指针C ++更改数据

时间:2012-05-19 15:08:09

标签: c++ function

在下面的截获函数中,我有buff作为指向缓冲区的指针,如何在不创建新的自己的缓冲区的情况下更改数据?

int WINAPI OwnRecv(SOCKET s, char FAR *buff, int len, int flags)
{
    if(s == ServerSocket)
    {
        int received = pTrampolineRecv(s, buff, len, flags);

        if(received <= 0)
        {
            return received;
        }

            unsigned char ReceiveBuffer[1024]; // how can i avoid creatin this by changing buff directly?
        do_decrypt((const unsigned char *) buff, ReceiveBuffer, received, KeyTest, NULL);
        buff = (char *) ReceiveBuffer;

        return received;
    }
    return pTrampolineRecv(s, buff, len, flags);
}

UPD

我添加了do_decrypt功能

bool do_decrypt(const unsigned char *in, unsigned char *out, int inlen)
{
  int buflen, tmplen;

  if(!EVP_DecryptUpdate(&Decrypt_ctx, out, &buflen, in, inlen))
  {
        return false;
  }

  if(!EVP_DecryptFinal_ex(&Decrypt_ctx, out + buflen, &tmplen))
    {
        return false;
  }

  return true;
}

3 个答案:

答案 0 :(得分:1)

如果do_decrypt不排除它,只需传入buff作为调用的第二个参数,并进行适当的转换以使其“工作”(编译)。

do_decrypt((const unsigned char *) buff, buff, received, KeyTest, NULL);

这意味着您的输入和输出缓冲区是相同的,这在被调用函数中可能会有问题。

在这种情况下(并且在任何情况下)您还需要确保输出缓冲区中有足够的空间来容纳解密数据,否则将发生缓冲区溢出并且您将遇到大麻烦。例如 - 在你的代码中,假设有2048个字节而不是1024个。看起来你应该(假设解密不会改变数据长度)允许在`ReceiveBuffer中使用received个字符。

您对ReceiveBufferbuff的分配只有本地范围:来电者不会看到此更改。在任何情况下,这都会使得使用该函数非常混乱,因为它可能会也可能不会改变输入值。

答案 1 :(得分:0)

在直接使用WinAPI代码之前,你一定要看看有关指针的C ++教程。

此外,不推荐使用FAR关键字。

最简单的想法是

do_decrypt ((const unsigned char*) buff, (unsigned char *) buff, received, KeyTest, NULL);

基本上 - 将buff作为输入和输出变量。

但是我不推荐使用它,因为我不知道do_decrypt函数是如何工作的 - 你可能会在解密时弄乱你自己的数据。如果do_decrypt使用某种(可能更小的)内部缓冲区,则仅使用上面的内容。

也许尝试更多地澄清这个问题,因为现在我无法就此问题给你更多的建议。

编辑:所以,感谢其他答案,您可以在以下时间使用上述解决方案:

  1. 结果数据将适合输入缓冲区(输出大小&lt; =输入大小)
  2. do_decrypt功能允许原位操作 - 因此,正在读取正在读取的数据。

答案 2 :(得分:0)

如果Bartek的答案不起作用 - 即,如果do_decrypt不支持对输入和输出使用相同的缓冲区 - 那么您需要从ReceiveBuffer复制数据进入buff,可能使用strcpy(如果它是空终止的)或memcpy(如果没有)。