Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert string to GSM 7-bit using C#

Tags:

c#

gsm

How can I convert a string to correct GSM encoded value to be sent to a mobile operator?

like image 912
Omar Avatar asked Mar 25 '26 10:03

Omar


1 Answers

Below is a port of gnibbler's answer, slightly modified and with a detailed explantation.

Example:

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

Implementation:

// 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;
    }
}
like image 145
Omar Avatar answered Mar 27 '26 23:03

Omar