2017-07-04 72 views
0

沒有爲我的功能原來的C#代碼: 他們的工作就像一個魅力,我將其轉換爲C++轉換函數[]從C#和C++

public static byte[] EncryptBlock(byte[] filebuffer) 
    { 
     int a, i, j, k, tmp; 
     int[] key, box; 
     byte[] cipher; 

     key = new int[KeyBoxLength]; 
     box = new int[KeyBoxLength]; 
     cipher = new byte[filebuffer.Length]; 

     for (i = 0; i < KeyBoxLength; i++) 
     { 
      key[i] = XorContentLock[i % XorContentLock.Length]; 
      box[i] = i; 
     } 
     for (j = i = 0; i < KeyBoxLength; i++) 
     { 
      j = (j + box[i] + key[i]) % 256; 
      tmp = box[i]; 
      box[i] = box[j]; 
      box[j] = tmp; 
     } 
     for (a = j = i = 0; i < filebuffer.Length; i++) 
     { 
      a++; 
      a %= KeyBoxLength; 
      j += box[a]; 
      j %= KeyBoxLength; 
      tmp = box[a]; 
      box[a] = box[j]; 
      box[j] = tmp; 
      k = box[((box[a] + box[j]) % KeyBoxLength)]; 
      cipher[i] = (byte)(filebuffer[i]^k); 
     } 
     return cipher; 
    } 

這就是他們如何看起來C++,但我沒有想法,爲什麼我有這些錯誤。

std::string Conversion::EncryptBlock(std::string& buffer) 
{ 
    int32 a, i, j, k, tmp; 
    int key[256]; 
    int box[256]; 
    BYTE* cipher = new BYTE[buffer.length]; 
    for (i = 0; i < KeyBoxLength; i++) 
    { 
     key[i] = XorFileLock[i % 16]; 
     box[i] = i; 
    } 
    for (j = i = 0; i < KeyBoxLength; i++) 
    { 
     j = (j + box[i] + key[i]) % 256; 
     tmp = box[i]; 
     box[i] = box[j]; 
     box[j] = tmp; 
    } 
    for (a = j = i = 0; i < buffer.length; i++) 
    { 
     a++; 
     a %= KeyBoxLength; 
     j += box[a]; 
     j %= KeyBoxLength; 
     tmp = box[a]; 
     box[a] = box[j]; 
     box[j] = tmp; 
     k = box[((box[a] + box[j]) % KeyBoxLength)]; 
     cipher[i] = (byte)(buffer[i]^k); 
    } 
    std::string ret(reinterpret_cast< char const* >(cipher)); 
    delete[] cipher; 

    return ret; 
} 

當我編譯,我有這樣的:

enter image description here

我已經得到了如何將它們轉換,並動態分配一個字節數組的一些文章。但在我的情況,似乎是行不通的,我不知道如何將那些工作的C#代碼轉換爲C++。沒有得到如何將C#byte []解析爲unsigned * int C++,並將這些數組轉換爲std :: string之後。

那麼,我在做什麼錯?請解釋一下,爲什麼?它應該是怎樣的? 又如: enter image description here

+0

我已經閱讀過這些內容,然後嘗試,但他們告訴我「表達式必須有一個恆定的值」。我完全失望。 –

+0

@EamonnMcEvoy C++沒有可變長度數組。它確實有'std :: vector'。 –

+0

上面的代碼「應該」起作用,因爲我無法看到任何錯誤(我在教程上完全一樣),並且IntelliTrace上也沒有任何內容,沒有任何紅線。只是簡單不編譯...屏幕上方。不知道如何轉換這些... –

回答

3

std::string::length是一種方法,而不是一個常量。您看到的錯誤告訴您,您無法將「指向std::string的成員函數」的指針轉換爲unsigned int。你錯過了一對括號:

BYTE* cipher = new BYTE[buffer.length()]; 
            // ^^ Here 

無關您的問題,您應該使用std::vector<BYTE>,而不是管理自己的原始陣列。你可以的cipher申報改爲

std::vector<BYTE> cipher(buffer.length()); 

和改變ret的聲明

std::string ret(cipher.begin(), cipher.end()); 

那麼你不必記得delete[] cipher。雖然沒有真正的理由將cipher複製到ret,但您可以直接聲明cipherstd::string cipher(buffer.length(), '\0');return cipher;

+0

哦,謝謝你解釋這些! –

+0

@HappyDay如果答案幫助您解決問題/錯誤,請將其標記爲正確答案,以便其他閱讀您的問題或具有相同問題的人員知道去哪裏尋找答案。 –