我想实现类似Vigenère密码的东西,我选择使用D的关联数组。
struct Codes
{
int[char] enc;
char[int] dec;
}
然后我用
填充AAforeach(immutable char c; letters ~ whitespace ~ digits)
{
codes.enc[c] = codes.enc.length;
codes.dec[codes.enc.length] = c;
}
它可以工作,因为它可以在我的[en / de]加密函数中工作,但我有两个问题:
(如果这件事无论如何,我正在使用dmd v2.053编译器。)
答案 0 :(得分:3)
dec可以是正常数组(它等于letters ~ whitespace ~ digits
btw)
在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"));
}