2013-05-05 30 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++书,这些东西应该在那里解释!

相关问题