1

我正在开发消息广播消息。
我在检查余额时遇到问题。响应如下:

Service reply        : "00500075006C007300610020003000200073002F006400200031004A
0075006E00310033002E0020004700610075006C002000420075006C0061006E0061006E00200031
002E003500470042002C005200700034003900720062002F0062006C006E002E0020004E00470045
0042005500540026004D0055005200410048000A00310020004D00610075000A003200200049006E
007400650072006E00650074002F00420042000A003300200050006B007400200053007500700065
0072002000480065006D00610074000A003400200050006B00740020004E0065006C0070006F006E
000A0035002000500072006F006D006F004B006F006E00740065006E000A00360020006D00500075
006C00730061000A00370020004D00790049006E0066006F000A"

如何阅读(解密)它?

4

2 回答 2

3

我知道这是一个旧帖子。仍然想为可能需要它的任何人做出贡献,曾经遇到过这个问题。

<?php
function decode_string($str){
    //split the reply in chunks of 4 characters (each 4 character is hex encoded), use | as separator
    $str = str_replace(" ", "", $str); // remove normal space, you might have better ways of doing this
    $chunk = chunk_split($str, 4, '|');
    $coded_array = explode('|', $chunk);
    $n = count($coded_array);
    $decoded = '';
    for($i = 0; $i < $n; $i++){
        $decoded .= chr(hexdec($coded_array[$i]));
    }
    return $decoded;
}

$reply = "00500075006C007300610020003000200073002F006400200031004A".
"0075006E00310033002E0020004700610075006C002000420075006C0061006E0061006E00200031".
"002E003500470042002C005200700034003900720062002F0062006C006E002E0020004E00470045".
"0042005500540026004D0055005200410048000A00310020004D00610075000A003200200049006E".
"007400650072006E00650074002F00420042000A003300200050006B007400200053007500700065".
"0072002000480065006D00610074000A003400200050006B00740020004E0065006C0070006F006E".
"000A0035002000500072006F006D006F004B006F006E00740065006E000A00360020006D00500075".
"006C00730061000A00370020004D00790049006E0066006F000A";
echo "<pre>";
echo decode_string($reply);
echo "</pre>";
?>

输出:

Pulsa 0 s/d 1Jun13. Gaul Bulanan 1.5GB,Rp49rb/bln. NGEBUT&MURAH
1 Mau
2 Internet/BB
3 Pkt Super Hemat
4 Pkt Nelpon
5 PromoKonten
6 mPulsa
7 MyInfo
于 2014-06-26T10:22:34.440 回答
1

刚遇到同样的问题。显然,这些消息可以像 SMS(文本)一样进行 PDU 编码。

但是这种直接进入人们的眼睛 - 它是四个字节的十六进制值(也许是 Unicode?然后也​​许读入 ByteArray 并解码为 String 可能会奏效)。

这是一个快速的 Python 3 脚本:

reply = "00500075006C007300610020003000200073002F006400200031004A" \
"0075006E00310033002E0020004700610075006C002000420075006C0061006E0061006E00200031" \
"002E003500470042002C005200700034003900720062002F0062006C006E002E0020004E00470045" \
"0042005500540026004D0055005200410048000A00310020004D00610075000A003200200049006E" \
"007400650072006E00650074002F00420042000A003300200050006B007400200053007500700065" \
"0072002000480065006D00610074000A003400200050006B00740020004E0065006C0070006F006E" \
"000A0035002000500072006F006D006F004B006F006E00740065006E000A00360020006D00500075" \
"006C00730061000A00370020004D00790049006E0066006F000A"

def chunks(l, n):
  """ Yield successive n-sized chunks from l.
      http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks-in-python
  """
  for i in range(0, len(l), n):
    yield l[i:i+n]

for chunk in list(chunks(reply, 4)):
  print( chr( int( chunk[2:],16) ), end="" )

和输出:

Pulsa 0 s/d 1Jun13. Gaul Bulanan 1.5GB,Rp49rb/bln. NGEBUT&MURAH
1 Mau
2 Internet/BB
3 Pkt Super Hemat
4 Pkt Nelpon
5 PromoKonten
6 mPulsa
7 MyInfo
于 2013-06-27T20:03:57.670 回答