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

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*&

4

2 回答 2

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

不是

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

但是就像上面的评论所说,当你不理解指针时,为什么要使用指针呢?std::string通过使用和/或可以更简单地编写此代码并减少错误std::vector

于 2013-05-05T08:35:45.183 回答
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++ 书,这些东西应该在那里解释!

于 2013-05-05T09:10:42.990 回答