#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;
}
meme@ubuntu:~/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);
如何传递unsigned char*&
答案 0 :(得分:2)
unsigned char* output;
rc4(data,pwd,output);
不
unsigned char output[256];
rc4(data,pwd,*output);
但是就像上面的评论所说,为什么在你不理解指针时使用指针?使用std::string
和/或std::vector
可以更简单地编写此代码并减少错误。
答案 1 :(得分: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[]
。然而,正如其他人指出的那样,使用像矢量或字符串这样的容器是更清洁的方式。获得一本好的C ++书籍,应该在那里解释这些东西!