2017-07-04 60 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如果答案帮助您解决问题/错误,请将其标记为正确答案,以便其他阅读您的问题或具有相同问题的人员知道去哪里寻找答案。 –