2013-10-26 6 views
1

все! Я испытываю трудности с школьным проектом, в котором мы реализуем шифр Змея. Проблема находится в функцииПередача массива unsigned char по ссылке в C++

setKey(unsigned char (&user_key[32])) 

Я хотел бы передать массив байт размера 32 в мою функцию, а затем моя функции делать всякие вещи для значений этого массива. Мой код, как я печататься не будет компилироваться, так как я получаю ошибку -

no known conversion for argument 1 from ‘unsigned char (*)[32]’ to 
‘unsigned char (&) [32]’ 

Я просмотрел ряд подобных сообщений, и ни одно из решений, которые я нашел, кажется, ведут к моему компиляции кода или компиляции, выполняя то, что мне бы хотелось. К сожалению, я не помню, как я в последний раз получил мой код для компиляции, но когда я сделал, вывод на печать значения user_key [] в функции SetKey() дал мне следующий вывод:

19, 0, 0, 0, 51, 0, 0, 0, 83, 0, 0, 0, 115, 0, 0, 0, 20, 0, 0, 0, 52, 0, 0, 0, 
84, 0, 0, 0, 116, 0, 0, 0 

В дополнение , когда он работал, он вышел с segfault после распечатки строки «Это конец. Мой единственный друг, конец». а также предупреждение «обнаружение разбитого стека». Короче говоря, мой код, кажется, все в порядке. Любая помощь будет принята с благодарностью!

#include <iostream> 
#include <math.h> 

using namespace std; 

class KeySchedule{ 

    int ip[64]; 
    int key_size; 
    unsigned long long int k0; 
    unsigned long long int k1; 
    unsigned long long int k2; 
    unsigned long long int k3; 

public: 

    KeySchedule(){ 

    /*The initial permutation. To be applied to the plaintext and keys. 
     ip = {0, 32, 64, 96, 1, 33, 65, 97, 2, 34, 66, 98, 3, 35, 67, 99, 
     4, 36, 68, 100, 5, 37, 69, 101, 6, 38, 70, 102, 7, 39, 71, 103, 
     8, 40, 72, 104, 9, 41, 73, 105, 10, 42, 74, 106, 11, 43, 75, 107, 
     12, 44, 76, 108, 13, 45, 77, 109, 14, 46, 78, 110, 15, 47, 79, 111, 
     16, 48, 80, 112, 17, 49, 81, 113, 18, 50, 82, 114, 19, 51, 83, 115, 
     20, 52, 84, 116, 21, 53, 85, 117, 22, 54, 86, 118, 23, 55, 87, 119, 
     24, 56, 88, 120, 25, 57, 89, 121, 26, 58, 90, 122, 27, 59, 91, 123, 
     28, 60, 92, 124, 29, 61, 93, 125, 30, 62, 94, 126, 31, 63, 95, 127}; 
    */ 

    for (int i = 0; i < 127; i++){ 
     ip[i] = (32*i) % 127; 
    } 
    ip[127] = 127; 

    k3 = 0; 
    k2 = 0; 
    k1 = 0; 
    k0 = 0; 
    key_size = -1; 
    } 

    void setKey (unsigned char (&user_key)[32]){ 

    for (int i = 0; i<32; i++){ 
     cout << (int)(user_key)[i] << endl; 
    } 

    for (int i = 0; i<8; i++){ 
     k3 ^= (int)(user_key)[i] << (8-i); 
     k2 ^= (int)(user_key)[i+8] << (8-i); 
     k1 ^= (int)(user_key)[i+16] << (8-i); 
     k0 ^= (int)(user_key)[i+24] << (8-i); 
    } 

    } 
}; 

int main(){ 

    unsigned char testkey[]= {0x01, 0x02, 0x03, 0x04, 
       0x05, 0x06, 0x07, 0x08, 
       0x09, 0x0a, 0x0b, 0x0c, 
       0x0d, 0x0e, 0x0f, 0x10, 
       0x20, 0x30, 0x40, 0x50, 
       0x60, 0x70, 0x80, 0x90, 
       0xa0, 0xb0, 0xc0, 0xd0, 
       0xe0, 0xf0, 0x00, 0xff}; 

    cout << "The size of testkey is: " 
     << sizeof(testkey)/sizeof(*testkey) << endl; 

    KeySchedule ks = KeySchedule(); 

    ks.setKey(&testkey); 
    cout << "This is the end. My only friend, the end." << endl; 
}; 

ответ

3

Вы передаете адрес, с unsigned char массив, то есть указатель на unsigned char[32]. Вы нуждаетесь в этом:

ks.setKey(testkey); 
+0

Большое спасибо за помощь! Однако у меня такая же проблема при печати значений user_key. Любая идея о том, почему она будет печатать 19, 0, 0, 0, 51, 0, 0, 0, ... для значений массива? – hatgirl

Смежные вопросы