2013-05-05 28 views
-1
#include <string.h> 

using namespace std; 

void rc4(unsigned char * ByteInput, unsigned char * pwd, 
    unsigned char * &ByteOutput){ 
    unsigned char * temp; 
    int i,j=0,t,tmp,tmp2,s[256], k[256]; 
    for (tmp=0;tmp<256;tmp++){ 
     s[tmp]=tmp; 
     k[tmp]=pwd[(tmp % strlen((char *)pwd))]; 
    } 
    for (i=0;i<256;i++){ 
     j = (j + s[i] + k[i]) % 256; 
     tmp=s[i]; 
     s[i]=s[j]; 
     s[j]=tmp; 
    } 
    temp = new unsigned char [ (int)strlen((char *)ByteInput) + 1 ] ; 
    i=j=0; 
    for (tmp=0;tmp<(int)strlen((char *)ByteInput);tmp++){ 
     i = (i + 1) % 256; 
     j = (j + s[i]) % 256; 
     tmp2=s[i]; 
     s[i]=s[j]; 
     s[j]=tmp2; 
     t = (s[i] + s[j]) % 256; 
     if (s[t]==ByteInput[tmp]) 
      temp[tmp]=ByteInput[tmp]; 
     else 
      temp[tmp]=s[t]^ByteInput[tmp]; 
    } 
    temp[tmp]=' '; 
    ByteOutput=temp; 
} 

int main() 
{ 
    unsigned char data[256] = "hello"; 
    unsigned char pwd[256] = "2147124912"; 
    unsigned char output[256]; 
    rc4(data,pwd,*output); 

    return 0; 
} 

[email protected]:~/CSCI368$ g++ try.cpp -o try 
try.cpp: In function ‘int main()’: 
try.cpp:42:20: error: invalid initialization of non-const reference of type ‘unsigned char*&’ from an rvalue of type ‘unsigned char*’ 
try.cpp:5:6: error: in passing argument 3 of ‘void rc4(unsigned char*, unsigned char*, unsigned char*&)’ 

我試圖編譯,但我覺得我的論點3有問題rc4(data,pwd,*output);RGD:如何通過無符號字符*

我如何通過作爲unsigned char*&

+1

使用'的std :: string'和你的生活會更容易 – 2013-05-05 08:32:46

+0

「如何通過無符號字符*&」 - 在一個格式正確的方式,也許? – 2013-05-05 08:33:01

回答

2
unsigned char* output; 
rc4(data,pwd,output); 

unsigned char output[256]; 
rc4(data,pwd,*output); 

但是,像上面說的意見,爲什麼使用指針,當你不明白指針?這個代碼可以通過使用std::string和/或std::vector更簡單,寫有更少的錯誤。

+0

我如何做與字符串n向量。我在某個站點發現了這個rc4加密代碼..我也無法測試輸出。不知道我做錯了什麼 – user1777711 2013-05-05 09:00:11

+0

如果你不知道指針,你不知道向量,那麼我認爲你應該從學習一點C++開始。像在互聯網上的許多代碼一樣,你發現的代碼質量很低(實際上它看起來很煩人)。維基百科有一個很好看的描述http://en.wikipedia.org/wiki/RC4我建議你從這個描述寫你自己的版本,使用數組,矢量或任何你感覺最舒服的字符串。這對你來說也是一個很好的學習練習。 – john 2013-05-05 09:30:03

0

這個例子你還遠遠沒有最小的,請在發佈前減少你的代碼。無論如何,重點在於當數組傳遞給一個函數時,它被隱式轉換爲指向第一個元素的指針。假設此代碼:

void f(unsigned char*); 
unsigned char array[100]; 
f(array); 

這相當於:

void f(unsigned char*); 
unsigned char array[100]; 
unsigned char* ptr = &array[0]; 
f(ptr); 

的一點是,通過時的參考,你意味着基準可能被修改。這個指針是編譯器創建的一個未命名的臨時對象,所以對它的任何修改都會丟失。出於這個原因,這種轉換是被禁止的,這是錯誤的全部內容。

你並不想傳遞一個數組,但一個真正的,非暫時性的指針。另外,您想在完成時使用delete[]。然而,正如其他人指出的那樣,使用像vector或string這樣的容器是更簡潔的方法。獲得一本好的C++書,這些東西應該在那裏解釋!

相關問題