基于文本表用十六进制替换char

本文关键字:十六进制 替换 char 于文本 文本 | 更新日期: 2023-09-27 17:53:39

这篇文章可能更多的是理论而不是代码。

我想知道是否有一种(相对)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"转换为十六进制(68 65 6C 6C 6F)。我想把这些十六进制数字,并将它们映射到上表中定义的新位置。

那么,"hello"现在看起来是这样的:

07 04 0B 0B 0E

我可以很容易地将字符串转换为数组,但是我不知道下一步该怎么做。我觉得foreach循环可以做到这一点,但我还不知道它的确切内容。

是否有简单的方法来做到这一点?这似乎不应该太难,但我不太确定如何去做。

非常感谢你的帮助!

基于文本表用十六进制替换char

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();
参考:

  • Array.IndexOf
  • Enumerable.ToDictionary
  • Enumerable.Select
  • String.Join