2013-01-15 53 views
1

這篇文章可能比代碼更理論。用文本表替換字符與十六進制

我想知道是否有(相對)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)。我想取這些十六進制數字,並將它們映射到上表中定義的新位置。

所以,「你好」就現在這個樣子:

07 04 0B 0B 0E 

我可以將字符串很容易地轉換成一個數組,但我卡在下一步該怎麼做。我覺得foreach循環會做到這一點,但它確切的內容我還不知道。

有沒有簡單的方法來做到這一點?它似乎不應該太難,但我不太清楚如何去做。

非常感謝您的幫助!

+0

我認爲你是廁所國王爲'IndexOf'方法。 – phoog

+0

你使用C#4嗎? –

+0

@JonathonReinhart是的。 –

回答

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(); 

參考:

+0

你先生,太棒了!我對字典不太瞭解,所以我永遠都不會知道。非常感謝! –

+0

這使用了很多來自'System.Linq'的東西,但希望它對你有意義,並不是幾行伏都教最終會在你的代碼中混淆視聽。我建議你簽出MSDN文檔並理解*每行代碼。 –

+1

我對Linq知之甚少,但我會盡力去理解這一切。 –

相關問題