I've the following hexadecimal code that I want to parse. For curious people, this is a MMS packet.
e306246170706c69636174696f6e2f766e642e7761702e6d6d732d6d65737361676500af84b4818c82986e323333426178773042737549684d008d918918802b33333631313131313131312f545950453d504c4d4e0086818a808e02271088058103093a8083687474703a2f2f772e732f6158585842737549684d00
Detailed version is here:
e3 // Wsp transactionId
06 // Push type
24 // Length of the content type field and headers
6170706c69636174696f6e2f766e642e7761702e6d6d732d6d657373616765 // application/vnd.wap.mms-message
00 // Null terminated
af84 // X-Wap-Application-ID
b481 // ?
8c82 // X-MMS-Message-Type:m-notification-ind
986e323333426178773042737549684d00 // Transaction id random with seed
8d // MMS version
91 // 1.1
89 // From
18 // Length of from
80 // Address present
2b3333363131313131313131 // Sender phone number
2f545950453d504c4d4e // /TYPE=PLMN
00 // Null terminated
8681
8a // Message class
80 // Personnal (81=Ad, 82=Informational, 83=Auto)
8e // Message size
02 // Size will be coded on 2 bytes
2710 // 10000 bytes
88 // X-Mms-Expiry
05 // Field size
81 // Relative date format
03 // Time will be coded on 3 bytes
093a80 // Seconds
83 // X-MMS-Content-Location
687474703a2f2f772e732f6158585842737549684d // Url to the server
00 // Null terminated
I need to get the phone number which 2b3333363131313131313131
in my hex code and the url to the server which is 687474703a2f2f772e732f6158585842737549684d
.
I'm working in Java for Android. I'm nearly sure I need to use pattern but I don't understand how it works.
I've done the following piece of code (which obviously, doesn't work):
PhoneNumber pattern:
String number = hexCode.replace("^89([a-f0-9])00$", "$1");
number = number.substring(6, number.length() - 22);
// Number should be equal to 2b3333363131313131313131
Url pattern
String url = hexCode.replace("^83([a-f0-9])00$", "$1");
url = url.substring(2, url.length() - 2);
// Url should be equal to 687474703a2f2f772e732f6158585842737549684d
Could you help me to make these patterns work ?
Edit: I'm able to do the job WITHOUT patterns, but I don't think this is the best solution to be used.
// Try to find the pattern "http"
if (pduS.indexOf("68747470") > -1)
{
String url = pduS.substring(pduS.indexOf("68747470"), pduS.length() - 2);
Log.e(">>>>>>", "Url: " + convertHexToString(url));
}
// Try to find the pattern "/TYPE=PLMN"
if (pduS.indexOf("2b") > -1 && pduS.indexOf("2f545950453d504c4d4e") > -1)
{
String shortPdu = pduS.substring(0, pduS.indexOf("2f545950453d504c4d4e"));
String number = pduS.substring(shortPdu.lastIndexOf("2b"), pduS.indexOf("2f545950453d504c4d4e"));
Log.e(">>>>>>", "Number: " + number);
Log.e(">>>>>>", "Number: " + convertHexToString(number));
}
If someone needs the answer to my question, here are the patterns to use:
Number: ^2b[0-9abcdefABCDEF]+2f545950453d504c4d4e$
Url: ^68747470[0-9abcdefABCDEF]+00$
And here is the application to the MMS Pdu:
public String getNumber(String pduString)
{
Pattern p = Pattern.compile("^2b[0-9abcdefABCDEF]+2f545950453d504c4d4e$");
Matcher m = p.matcher(pduString);
return m.find() ? m.group(1) : "";
}
public String getUrl(String pduString)
{
Pattern p = Pattern.compile("^68747470[0-9abcdefABCDEF]+00$");
Matcher m = p.matcher(pduString);
return m.find() ? m.group(1) : "";
}
Please let me know if you have any trouble with this code.
PS: You may need to add +
to the number to get it on the internation format and http://
to the url.