3

文字列を正しい GSM エンコード値に変換して携帯電話会社に送信するにはどうすればよいですか?

4

2 に答える 2

8

以下は、わずかに変更され、詳細な説明が加えられた、ニブラーの回答の移植です。

例:

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

        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;
    }
}
于 2013-06-20T16:26:59.913 に答える