这篇文章可能比代码更具理论性。
我想知道是否有(相对)simple
方式使用文本表(基本上是字符数组)并根据字符串的值替换字符串中的字符。
让我详细说明。
假设我们有这两行表:
table[0x0] = new char[] {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p'};
table[0x1] = new char[] {'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ']', ',', '/', '.', '~', '&'};
每个数组有16个成员,0-F为十六进制。
假设我们将字符串“hello”转换为hex(68 65 6C 6C 6F)。我想取这些十六进制数字,并将它们映射到上表中定义的新位置。
所以,“你好”现在看起来像这样:
07 04 0B 0B 0E
我可以轻松地将字符串转换为数组,但我仍然坚持下一步该做什么。我觉得foreach循环可以解决问题,但这是我还不知道的确切内容。
有一种简单的方法吗?看起来它不应该太难,但我不太确定如何去做。
非常感谢您的帮助!
答案 0 :(得分:1)
static readonly char[] TABLE = {
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ']', ',', '/', '.', '~', '&',
};
// Make a lookup dictionary of char => index in the table, for speed.
static readonly Dictionary<char, int> s_lookup = TABLE.ToDictionary(
c => c, // Key is the char itself.
c => Array.IndexOf(TABLE, c)); // Value is the index of that char.
static void Main(string[] args) {
// The test input string. Note it has no space.
string str = "hello,world.";
// For each character in the string, we lookup what its index in the
// original table was.
IEnumerable<int> indices = str.Select(c => s_lookup[c]);
// Print those numbers out, first converting them to two-digit hex values,
// and then joining them with commas in-between.
Console.WriteLine(String.Join(",", indices.Select(i => i.ToString("X02"))));
}
输出:
07,04,0B,0B,0E,1B,16,0E,11,0B,03,1D
请注意,如果您提供的输入字符不在查找表中,您将不会立即注意到它! Select
会返回IEnumerable
,只有在您使用它时才会进行延迟评估。此时,如果未找到输入字符,则字典[]
调用将抛出异常。
使这一点更明显的一种方法是在Select之后调用ToArray()
,因此你有一个索引数组,而不是IEnumerable
。这将迫使评估立即发生:
int[] indices = str.Select(c => s_lookup[c]).ToArray();
参考: