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

问题描述 投票:2回答:2

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

c# gsm
2个回答
7
投票

下面是qazxsw poi的一个端口,略有修改并附有详细说明。

例:

gnibbler's answer

执行:

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

0
投票

奥马尔的代码对我不起作用。但我找到了实际的代码:

// 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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.