C 根据用户输入声明特定宽度变量的最佳方法

C 根据用户输入声明特定宽度变量的最佳方法,c,reusability,stdint,C,Reusability,Stdint,我有一个如下所示的代码。如果word\u size=64,则此处的代码为。以类似的方式,我也需要32岁和16岁。我找不到一种方法来重复使用相同的encrypt函数来处理所有大小的文件。此外,我还需要根据单词大小声明变量,即使用uint\u 16或uint\u 32或uint\u 64取决于单词大小。在这种情况下,你能帮我写一个可重用的代码吗 #include<stdio.h> #include<stdint.h> void encrypt(uint64_t* , uin

我有一个如下所示的代码。如果
word\u size=64
,则此处的代码为。以类似的方式,我也需要32岁和16岁。我找不到一种方法来重复使用相同的
encrypt
函数来处理所有大小的文件。此外,我还需要根据单词大小声明变量,即使用
uint\u 16
uint\u 32
uint\u 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.
        }
#包括
#包括
无效加密(uint64\u t*、uint64\u t*、uint64\u t*);
int main(){
整块大小;
//获取用户输入
printf(“输入块大小:\n”);
scanf(“%d”,&block_size);//可以是32、64或128
int word\u size=block\u size/2;//16,32或64
//根据单词的大小,我应该用
//相应宽度
uint64纯文本[2]={0,0};
uint64_t密码文本[2]={0,0};
uint64密钥文本[2]={0,0};
uint64_t*pt,*ct,*k;
加密(pt、ct、k);
}
/*
*加密法
*/
无效加密(uint64\u t*pt、uint64\u t*ct、uint64\u t*k){
//涉及位移位算法,该算法仅适用于精确大小,即eiter 16、32或64。
}

如果需要,我可以提供更多信息。

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

定义具有最大大小的函数,并使其接受附加的宽度参数。然后通过将输入与每种类型的最大值进行比较来确定运行时的宽度。您有使用C++的选项吗?如果你这么做了,那么函数模板将解决你的设计问题。对不起,没有C++选项。“有没有一个简单的方法来解决这个问题?”尤金尼什说。按照你说的做,如果我传递一个较小的值,那么在MSB上用0填充它,使其成为64位,对吗?如果是这种情况,函数将无法执行算法。这就是为什么要传递width参数。你的算法应该研究它并进行自我调整。如果你想让我试着给你一个代码示例,而不是我使用的示例代码,请告诉我。你可能还需要定义不同的位掩码?
Value is  :10000000000
Value is  :100