2015-03-16 4 views
0

У меня есть код, который выглядит, как показано ниже. Код здесь, если word_size = 64. Аналогичным образом мне нужно иметь и 32, и 16. Я не могу найти способ повторно использовать ту же функцию encrypt для всех размеров. Кроме того, мне нужно объявить переменные тоже в соответствии с word_size, т.е. использовать либо uint_16, либо uint_32 или uint_64 зависит от слова_размер. Можете ли вы помочь мне написать код повторного использования в этом случае?Лучший способ объявить конкретные переменные ширины в зависимости от пользовательского ввода

#include<stdio.h> 
#include<stdint.h> 

void encrypt(uint64_t* , uint64_t*, uint64_t*); 

int main(){ 

    int block_size; 

    // Get the user inputs 
    printf("input the block size: \n"); 
    scanf("%d", &block_size); // can be 32, 64 or 128 

    int word_size = block_size/2; // 16,32 or 64 

    // Depending on the word_size, I should declare the variables with 
    // corresponding width 
    uint64_t plain_text[2] = {0,0}; 
    uint64_t cipher_text[2] = {0,0}; 
    uint64_t key_text[2] = {0,0}; 

    uint64_t * pt, *ct, *k; 
    encrypt(pt, ct,k); 
    } 

/* 
* Ecnryption Method 
*/ 
void encrypt(uint64_t* pt, uint64_t* ct, uint64_t* k){ 

    // Involves bit shifting algorithm which works only on exact sizes i.e eiter 16,32 or 64. 
     } 

При необходимости я могу предоставить дополнительную информацию.

+0

Определим функцию с наибольшим размером, и сделать его принять дополнительные параметр ширины. Затем определите ширину во время выполнения, сравнив входные данные с максимальными значениями каждого типа. –

+0

У вас есть возможность использовать C++? Если вы это сделаете, шаблон функции решит вашу проблему с дизайном. –

+0

Извините, нет опции C++. разве нет простой способ в Clelef? – NanoNi

ответ

0

Существует способ сделать это в C - с помощью struct и union

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include <inttypes.h> 

enum type { 
    U64, 
    U32, 
    U16, 
    U8, 
}; 
struct container { 
    enum type type; 
    union { 
     uint64_t u64; 
     uint32_t u32; 
     uint16_t u16; 
     uint8_t u8; 
    } value; 
}; 

int test(struct container container) { 
    switch(container.type) { 
     case U64: 
      printf("Value is :%" PRIu64 "\n", container.value); 
      break; 
     case U32: 
      printf("Value is :%" PRIu32 "\n", container.value); 
      break; 
     case U16: 
      printf("Value is :%" PRIu16 "\n", container.value); 
      break; 
     case U8: 
      printf("Value is :%" PRIu8 "\n", container.value); 
      break; 
    } 
    return 0; 
} 

int main(int argc, char **argv) { 
    struct container c1, c2; 

    c1.type = U64; 
    c1.value.u64 = 10000000000ULL; 

    c2.type = U8; 
    c2.value.u8 = 100; 

    test(c1); 
    test(c2); 
    return 0; 
} 

Выход производства был:

Value is :10000000000 
Value is :100 
+0

Дайте мне знать, если вы хотите, чтобы я попробовал и привел вам пример с вашим кодом вместо кода примера, который я использовал. –

+0

Возможно, вам придется определить разные битовые маски? –