2017-07-04 6 views
0

Es ursprünglichen C# Code für meine Funktion ist: arbeitet sie wie ein Zauber, und ich werde sie zu C++Funktion Convert mit byte [] von 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; 
    } 

konvertieren Und das ist, wie sie aussieht auf C++, aber ich habe keine Ahnung, warum ich diese Fehler habe.

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

Und wenn ich kompilieren, dass, ich habe dies bekam:

enter image description here

Ich habe bereits einige Artikel, wie sie konvertieren und weisen dynamisch ein Byte-Array. Aber in meinem Fall scheint es, dass es nicht funktioniert, und ich kann nicht verstehen, wie man diejenigen, die C# -Code arbeiten, in C++ umwandelt. Ich habe nicht verstanden, wie C# byte [] in unsigned * int C++ aufgelöst wird, mit der Umwandlung dieses Arrays in std :: string nach.

Nun, was mache ich da falsch? Und erklären Sie bitte, warum? Und wie soll es sein? Ein anderes Beispiel: enter image description here

+0

Ich habe schon gelesen, und versuchen Sie, aber sie sagen mir, "Ausdruck muss einen konstanten Wert haben". Ich bin total enttäuscht. –

+0

@EamonnMcEvoy C++ hat keine Arrays variabler Länge. Es hat jedoch 'std :: vector'. –

+0

Code oben, "sollte" funktioniert, weil ich nicht in der Lage bin, einen Fehler zu sehen (ich habe das gleiche wie in Tutorials getan), und auch, gibt es nichts auf IntelliTrace, ohne irgendwelche roten Linien. Nur einfach nicht kompiliert ... Bildschirm oben. Weiß nicht, wie man diese umwandelt ... –

Antwort

3

std::string::length ist eine Methode, keine Konstante. Der Fehler, den Sie sehen, sagt Ihnen, dass Sie nicht von "Zeiger zu Elementfunktion von std::string" zu unsigned int konvertieren können. Sie sind ein Paar Klammer fehlen:

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

Unrelated, um Ihr Problem, sollen Sie std::vector<BYTE> verwenden, anstatt Ihren eigenen Roh-Arrays zu verwalten. Sie können die Deklaration von cipher zu

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

ändern und die Deklaration von ret zu

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

ändern Dann müssen Sie sich nicht zu delete[] cipher erinnern. Es gibt keinen wirklichen Grund, cipher zu ret zu kopieren, obwohl Sie cipher wie std::string cipher(buffer.length(), '\0'); und return cipher; direkt erklären konnten.

+0

Oh, danke für die Erklärung! –

+0

@HappyDay Wenn die Antwort Ihnen geholfen hat, Ihr Problem/Fehler zu lösen, markieren Sie es bitte als die richtige Antwort, damit andere, die Ihre Frage lesen oder das gleiche Problem haben, wissen, wo sie suchen müssen. –