почему я получаю только цифры в UCS2, как я могу исправить в командах и C #? - PullRequest
1 голос
/ 06 марта 2012

У меня проблема с чтением моих смс через шпаклевку, потому что я набираю AT + CMGL = "ALL", но сообщение (текст) и число - просто цифры, я прочитал, что мой модем gms nokia s10 использует UCS2, но Я не знаю, что здесь делать? Как я могу прочитать мое сообщение, просто увидев цифры? помогите пожалуйста

Также я использую этот код из codeproject, и я изменил эту строку, но это тот же результат, что и putty just number в ucs2

 public ShortMessageCollection ReadSMS(SerialPort port, string p_strCommand)
    {

        // Set up the phone and read the messages
        ShortMessageCollection messages = null;
        try
        {

            #region Execute Command
            // Check connection
            ExecCommand(port,"AT", 300, "No phone connected");
            // Use message format "Text mode"
            ExecCommand(port,"AT+CMGF=1", 300, "Failed to set message format.");
            // Use character set "PCCP437"
            **ExecCommand(port, "AT+CSCS=\"UCS2\"", 300, "Failed to set character set.")**;
            // Select SIM storage
            ExecCommand(port,"AT+CPMS=\"SM\"", 300, "Failed to select message storage.");
            // Read the messages
            string input = ExecCommand(port, p_strCommand, 5000, "Failed to read the messages.");
            #endregion

            #region Parse messages
            messages = ParseMessages(input);
            #endregion

        }
        catch (Exception ex)
        {
            throw ex;
        }

        if (messages != null)
            return messages;
        else
            return null;    

    }

Ответы [ 2 ]

2 голосов
/ 06 апреля 2013

Обратите внимание, что AT+CSCS влияет только на параметры string для команд и ответов. В случае AT+CMGL содержимое сообщения представляет собой не строку, а формат <data>. См. Спецификацию 27.005 для получения более подробной информации об этом формате, он немного сложен (обратите внимание только на первую часть In the case of SMS, игнорируйте вторую часть In the case of CBS).

Но вкратце это означает, что для UCS-2 вы получите шестнадцатеричный код данных (например, два символа '2' и 'A' представляют один байт со значением 0x2A (символ ASCII / UTF-8 * 1015). *)). Таким образом, вы должны декодировать 4 и 4 полученных байта как шестнадцатеричное кодирование 16 битов в символе UCS-2.

Так что декодируйте в байтовый массив, а затем конвертируйте в строку, см. ответ Appleman1234 за это (его ответ не касается основной проблемы, а именно шестнадцатеричного декодирования).

0 голосов
/ 17 марта 2012

Для преобразования из кодировки UCS-2 сохраните результат (входные данные) в байтовом массиве вместо строки и затем вызовите

System.Text.Encoding enc =  Encoding.Unicode;
string myString = enc.GetString(myByteArray);

Если кодировка UCS-2 имеет Big Endian, то измените System.Text.Encoding enc = Encoding.Unicode; to System.Text.Encoding enc = Encoding.BigEndianUnicode;.

К связанным ресурсам относятся:

...