收到的USSD消息解码

3

我正在向一个调制解调器发送AT+CUSD命令,当我收到这条消息时,无论如何都无法理解或解码它,请帮助我。 以下是样例:

AT+CUSD=1,"*100#",15
+CUSD: 0,"Service not allowed.",15
OK
AT+CUSD=1,"*155#1#",15
+CUSD: 0,"0645063306280642002006270644062F06410639003A00200037002C003600320035002E0030003000200020000A06270644063506440627062D064A0629003A0030002E0030003000200020000A00200627064406440627062D0642002006270644062F06410639003A0030002E003000300020",72
OK

你看到的第一个是可读性的,dcs是15,但另一个不是,dcs是72,求救!!


你尝试过使用各种常见的编码方案(如GSM 7位、UCS2等)解码这个长串数字,看看能否从中理解出一些意义? - user1725145
نعم، لم يعمل معي. على فكرة، يجب أن تكون هذه الإجابة باللغة العربية. - samhightech
1
当您使用Unicode解码它时,会得到什么?我可以看到很多06,并且根据维基百科,标准阿拉伯语编码为0600-06FF。 - user1725145
感谢S先生的帮助,您帮我找到了解决方案。正如您所说,它就像每四个字符组成一个16位Unicode字符,但在Unicode中,我得到了类似于“مسبق!الدفع:! 7,625.00! !”的东西,但在UCS-2中,我得到了“مسبق الدفع: 7,625.00”,这是正确的,谢谢,问题已经解决。 - samhightech
1个回答

4

使用Unicode解码后会得到什么?我看到了很多06的数字,根据维基百科,标准阿拉伯语编码范围是0600-06FF。S列表

答案来自于S列表

需要使用“UCS2”编码,每四个字母进行一次解码,例如“0645”。

我的代码如下:

String origin = "0645063306280642002006270644062F06410639003A00200037002C003600320035002E0030003000200020000A06270644063506440627062D064A0629003A0030002E0030003000200020000A00200627064406440627062D0642002006270644062F06410639003A0030002E003000300020";
if (origin.Count() % 2 == 0)
            {
                List<short> list = new List<short>();
                List<byte> bytes = new List<byte>();
                var encode = Encoding.GetEncoding("UCS-2");
                for (int i = 0; i < origin.Count(); i += 4)
                {
                    list.Add(Convert.ToInt16(origin.Substring(i, 4), 16));
                }
                foreach (var item in list)
                {
                    bytes.Add((byte)(item & 255));
                    bytes.Add((byte)(item >> 8));
                }
                return encode.GetString(bytes.ToArray());
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接