java ussd 中的 PDU 和 UCS2

PDU and UCS2 in java ussd

我在我的设备中使用 SIM-900。

我需要从 SIM 卡中获取余额。

我使用这个命令得到了这个结果。

Command Modem: AT+CUSD=1,"*555*1*2#" 

结果:

+CUSD: 0,"06270639062A062806270631002006270635064406CC002000340039003900380039063106CC06270644002E00200031062F064206CC064206470020062A064506270633003D003100300030062F064206CC064206470020062A06450627063300200631062706CC06AF062706460020062F063106470645062706460020063106480632",72

我知道这个结果是PDU格式和UCS2,但是我看不懂文本。

String pdu = "06270639062A062806270631002006270635064406CC002000340039003900380039063106CC06270644002E00200031062F064206CC064206470020062A064506270633003D003100300030062F064206CC064206470020062A06450627063300200631062706CC06AF062706460020062F063106470645062706460020063106480632"

SmsMessage smsMessage = SmsMessage.createFromPdu(pdu);

我用这个site。和工作,但我不能 java android。

06270639062A...0627 0639 062A ....
0627 是 Unicode 字符的十六进制 ا (ARABIC LETTER ALEF)
0639 是 Unicode 字符的十六进制 ع (ARABIC LETTER AIN)
062A 是 Unicode 字符的十六进制 ت (ARABIC LETTER TEH)
等等...

因此,将十六进制数字分成 4 个块,解析为十六进制并分配给 char(因为 char 是 UTF-16 又名 UCS2,像这样:

String input = "06270639062A062806270631002006270635064406CC002000340039003900380039063106CC06270644002E00200031062F064206CC064206470020062A064506270633003D003100300030062F064206CC064206470020062A06450627063300200631062706CC06AF062706460020062F063106470645062706460020063106480632";

char[] buf = new char[input.length() / 4];
for (int i = 0; i < buf.length; i++)
    buf[i] = (char) Integer.parseUnsignedInt(input.substring(i * 4, i * 4 + 4), 16);
String output = new String(buf);

System.out.println(output);

输出

اعتبار اصلی 49989ریال. 1دقیقه تماس=100دقیقه تماس رایگان درهمان روز