Преобразуйте 7-битную закодированную строку в обычный текст - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь прочитать SMS с D-link DWM-157 HSPA + USB-адаптер. Я могу читать SMS с помощью AT-команд. Код работает нормально, когда SMS-сообщения содержат символы меньше 160. Если SMS-сообщение содержит multipart, оно преобразуется в 7-битный формат, который я каким-то образом теперь могу декодировать с помощью этой библиотеки. метод Decode7bit () работает нормально, но когда длина строки (параметр этого метода) равна 268, а когда длина меньше 268, в результате выдается значение мусора. Код

  public static byte[] GetInvertBytes(string source)
    {
        byte[] bytes = GetBytes(source);

        Array.Reverse(bytes);

        return bytes;
    }
    public static byte[] GetBytes(string source, int fromBase)
    {
        List<byte> bytes = new List<byte>();

        for (int i = 0; i < source.Length / 2; i++)
            bytes.Add(Convert.ToByte(source.Substring(i * 2, 2), fromBase));

        return bytes.ToArray();
    }

    public static byte[] GetBytes(string source)
    {
        return GetBytes(source, 16);
    }

    public static string Decode7bit(string source, int length)
    {
        byte[] bytes = GetInvertBytes(source);

        string binary = string.Empty;

        foreach (byte b in bytes)
            binary += Convert.ToString(b, 2).PadLeft(8, '0');

        binary = binary.PadRight(length * 7, '0');

        string result = string.Empty;

        for (int i = 1; i <= length; i++)
            result += (char)Convert.ToByte(binary.Substring(binary.Length - i * 7, 7), 2);

        //return result.Replace('\x0', '\x40');
        return result.Replace("\0", "");
    }

и код, по которому я получаю SMS от GSM-модуля:

 public string Read()
    {
        //Console.WriteLine("Reading..");

        gsmPort.WriteLine("AT+CMGF=1"); // Set mode to Text(1) or PDU(0)
        Thread.Sleep(1000); // Give a second to write
        //gsmPort.WriteLine("AT+CPMS=\"SM\""); // Set storage to SIM(SM)
        gsmPort.WriteLine("AT+CPMS=\"ME\",\"SM\",\"MT\""); // Set storage to SIM(SM)

        Thread.Sleep(1000);
       // gsmPort.WriteLine("AT+CMGL=\"REC UNREAD\""); // What category to read ALL, REC READ, or REC UNREAD
        gsmPort.WriteLine("AT+CMGL=\"ALL\""); // What category to read ALL, REC READ, or REC UNREAD
        Thread.Sleep(1000);
        gsmPort.Write("\r");
        Thread.Sleep(1000);


        string response = gsmPort.ReadExisting();




        if (response.EndsWith("\r\nOK\r\n\r") || response.EndsWith("\r\nOK\r\n"))
        { //there is no error
            //Console.WriteLine(response);
            return response;
            // add more code here to manipulate reponse string.
        }
        else
        {
            return "ERROR";
            // add more code here to handle error.
            //Console.WriteLine(response);
        }

    }

Я искал 7-битные декодеры, но не могу получить подходящий результат. Может кто-нибудь сказать мне, как преобразовать 7-битную строку в обычный текст, или любой другой метод для чтения многочастных SMS без 7-битной кодировки или каких-либо AT-команд, которые делают сказанное.

...