2012-05-19 60 views
-1

在下面截取的函數中,我有buff作爲指向緩衝區的指針,如何在不創建新的自己的緩衝區的情況下更改數據?從指針C++中更改數據

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; 
} 
+0

你的意思是說你想改變'buff'中的數據嗎? –

+0

你想在這裏解決什麼問題?也就是說,爲什麼要試圖避免在堆棧上創建緩衝區? – Greg

+0

您正在將單位化的「int bufflen」傳遞給「EVP_DecryptUpdate」,這可能需要輸出緩衝區長度。 Roman,你需要學習基本的C++課程,而不是在SO上提問。 –

回答

0

你應該跳直上WinAPI的代碼之前一定先來看看C++教程的指針。

此外,FAR關鍵字已棄用。

最簡單的想法是

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

所以基本上 - 把buff作爲輸入和輸出變量。

但是我不推薦使用它,因爲我不知道do_decrypt函數是如何工作的 - 當解密時你可能會搞亂你自己的數據。只有在do_decrypt使用某種(可能較小的)內部緩衝區的情況下才可以使用。

也許試着澄清一下這個問題,因爲現在我無法再給你提出任何關於這個問題的建議。

編輯:因此,由於其他的答案,則可以使用以上時溶液:

  1. 結果數據將適合在輸入緩衝器(輸出<的大小=輸入的大小)
  2. do_decrypt功能允許原位操作 - 因此,正在讀取正在讀取的數據。
+0

我添加了我的代碼do_decrypt函數,但我不知道這個函數是否允許輸入輸出緩衝區(( – Roman

+1

)它仍在使用其他函數,所以我們對它的行爲一無所知,你必須查看關於這些'EVP _...的文檔。功能和檢查。 –

0

如果鮑爾泰克的答案不工作 - 也就是說,如果do_decrypt不使用相同的緩衝輸入和輸出支持 - 那麼你就需要將數據從ReceiveBuffer使用複製到buff,大概要麼是strcpy(如果它是空終止的)或memcpy(如果不是)。

1

如果do_decrypt不排除它,只需傳入buff作爲調用的第二個參數,並進行相應的轉換以完成此「工作」(編譯)。

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

這意味着您的輸入和輸出緩衝區是相同的,這可能在被調用函數中存在問題。

在這種情況下(無論如何),您還需要確保輸出緩衝區中有足夠的空間容納解密的數據,否則會發生緩衝區溢出,您將遇到很大麻煩。例如 - 在你的代碼中,假設有2048個字節而不是1024個。似乎你應該是(假設解密不會改變數據長度),允許'ReceiveBuffer中的received個字符。

您的ReceiveBufferbuff的任務僅具有本地範圍:調用者不會看到此更改。這樣做會在任何情況下使用該功能相當混亂,因爲它可能會或可能不會改變輸入值。