Arrays 关联阵列,对称算法,CTFE

Arrays 关联阵列,对称算法,CTFE,arrays,d,Arrays,D,我想实现类似密码的东西,我选择使用D的关联数组。 我使用 struct Codes { int[char] enc; char[int] dec; } 然后我用 foreach(immutable char c; letters ~ whitespace ~ digits) { codes.enc[c] = codes.enc.length; codes.dec[codes.enc.length] = c; } 它的工作原理与我的[en/de]加密函数的工作原

我想实现类似密码的东西,我选择使用D的关联数组。 我使用

struct Codes
{
    int[char] enc;
    char[int] dec;
}
然后我用

foreach(immutable char c; letters ~ whitespace ~ digits)
{
    codes.enc[c] = codes.enc.length;
    codes.dec[codes.enc.length] = c;
}
它的工作原理与我的[en/de]加密函数的工作原理相同,但我有两个问题:

  • 如果可以的话,我怎么能只用一个AA。或者是其他一些同样易于使用、效率更高或更适合第2点的数据结构
  • 我应该如何使用CTFE在编译时生成一些数据结构,并在运行时使用输出

  • (我现在正在使用dmd v2.053编译器,如果这有什么关系的话)。

    dec可以是一个普通数组(它等于
    字母~空格~数字
    顺便说一句)

    在enc中,如果只允许ASCII作为字符(长度为255,并将c转换为int作为索引),则也可以使用普通数组

    编辑

    您可以从
    letters~whitespace~ digits
    字符串创建一个mixin字符串,如下所示

    string createSwitch(string seq,string inp){
        string out = "switch("~inp~"){";
        int i=0;
        foreach(ch;seq){
            out~="case "~ch~":return "~i";";
        }
        out~="default: return -1;";
        return out;
    }
    
    然后您可以将其用作

    int intFromChar(char ch){
        mixin(createSwitch(letters ~ whitespace ~ digits,"ch"));
    }
    

    关于十二月你是对的-那太愚蠢了。我不想使用cast(int)ascii(忘记了menion)。您还可以创建一个额外的函数,将字符映射到int(0-25是a-z,26-52是a-z,53是空格,54-63是0-9),并将其用作索引