使用C#将字符串转换为GSM 7位

如何将字符串转换为正确的GSM编码值以发送给移动运营商?

下面是gnibbler答案的端口,稍加修改并详细说明。

例:

string output = GSMConverter.StringToGSMHexString("Hello World"); // output = "48-65-6C-6C-6F-20-57-6F-72-6C-64" 

执行:

 // Data/info taken from http://en.wikipedia.org/wiki/GSM_03.38 public static class GSMConverter { // The index of the character in the string represents the index // of the character in the respective character set // Basic Character Set private const string BASIC_SET = "@£$¥èéùìòÇ\nØø\rÅåΔ_ΦΓΛΩΠΨΣΘΞ\x1bÆæßÉ !\"#¤%&'()*+,-./0123456789:;<=>?" + "¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑÜ`¿abcdefghijklmnopqrstuvwxyzäöñüà"; // Basic Character Set Extension private const string EXTENSION_SET = "````````````````````^```````````````````{}`````\\````````````[~]`" + "|````````````````````````````````````€``````````````````````````"; // If the character is in the extension set, it must be preceded // with an 'ESC' character whose index is '27' in the Basic Character Set private const int ESC_INDEX = 27; public static string StringToGSMHexString(string text, bool delimitWithDash = true) { // Replace \r\n with \r to reduce character count text = text.Replace(Environment.NewLine, "\r"); // Use this list to store the index of the character in // the basic/extension character sets var indicies = new List(); foreach (var c in text) { int index = BASIC_SET.IndexOf(c); if(index != -1) { indicies.Add(index); continue; } index = EXTENSION_SET.IndexOf(c); if(index != -1) { // Add the 'ESC' character index before adding // the extension character index indicies.Add(ESC_INDEX); indicies.Add(index); continue; } } // Convert indicies to 2-digit hex var hex = indicies.Select(i => i.ToString("X2")).ToArray(); string delimiter = delimitWithDash ? "-" : ""; // Delimit output string delimited = string.Join(delimiter, hex); return delimited; } }