📄 smstools.java
字号:
// Useful tools for coding and decoding SMS//// file: SMSTools.java// used by: Msg.java//// For comments see header of SMS.java.//---------------------------------------------------------------------------------------package smspack;class SMSTools { /** * Convert a char array to a string * @param test character array * @return string */ public static String convertCharArray2String(char[] chararray) { int i, l; String text = new String(); l = chararray.length; for (i = 0; i < l; i++) { text = text + chararray[i]; } // for return text; } // convertChar2String /** * Create the main part part of a PDU, for sending via AT commands to * the mobile phone. The mobile phone complete this part of a PDU with * some data of the mobile phone and sends it then to the base station. * @param number dialing number * @param numbertype national/international dialing number * @param message message to send (SMS) * @return PDU */ public static byte[] getPDUPart(String number, boolean numbertype, String message) { byte[] pdu; byte[] no = convertDialNumber(number); byte[] msg = compress(convertUnicode2GSM(message)); int l = no.length; int m = msg.length; pdu = new byte[4 + l + 4 + m]; pdu[0] = 0x11; // message flags pdu[1] = 0x00; // message reference number with default value pdu[2] = (byte)number.length(); // set length of dialing number if (numbertype = SMS.TOA_NATIONAL) pdu[3] = (byte)0x81; // indicator for a national number else pdu[3] = (byte)0x91; // indicator for a international number System.arraycopy(no, 0, pdu, 4, l); // set dialing number pdu[4 + l] = 0x00; // protocol identifier with GSM 03.40 default value pdu[4 + l + 1] = 0x00; // data coding scheme, use GSM 03.38 character set (= default value) pdu[4 + l + 2] = (byte)0xAA; // message validity period = 4 days // message (= SMS content) pdu[4 + l + 3] = (byte)message.length(); // set length of message System.arraycopy(msg, 0, pdu, 4 + l + 4, m); // set message return pdu; } // getPDUPart /** * Convert a dialing number into the GSM format * @param number dialing number * @return coded dialing number */ public static byte[] convertDialNumber(String number) { int l = number.length(); int j = 0; // index in addr int n; // length of converted dial number byte[] data; // calculate length of converted dialing number n = l / 2; if (l % 2 != 0) { n++; } data = new byte[n]; for (int i = 0; i < n; i++) { switch (number.charAt(j)) { case '0': data[i] += 0x00; break; case '1': data[i] += 0x01; break; case '2': data[i] += 0x02; break; case '3': data[i] += 0x03; break; case '4': data[i] += 0x04; break; case '5': data[i] += 0x05; break; case '6': data[i] += 0x06; break; case '7': data[i] += 0x07; break; case '8': data[i] += 0x08; break; case '9': data[i] += 0x09; break; } // switch if (j + 1 < l) { switch (number.charAt(j + 1)) { case '0': data[i] += 0x00; break; case '1': data[i] += 0x10; break; case '2': data[i] += 0x20; break; case '3': data[i] += 0x30; break; case '4': data[i] += 0x40; break; case '5': data[i] += 0x50; break; case '6': data[i] += 0x60; break; case '7': data[i] += 0x70; break; case '8': data[i] += 0x80; break; case '9': data[i] += 0x90; break; } // switch } // if else { data[i] += 0xF0; } // else j += 2; } // for return data; } // convertDialNumber /** * Convert the address field (dialing number) from the GSM format * @param number dialing number * @return decoded dialing number */ public static String decodeAddressField(String number) { int len; // length of originating adress int n; // length of converted dial number String s, orgAdr=""; s = number.substring(0, 2); // get raw length [digits] of originating adress len = Integer.parseInt(s, 16); // calculate length [digits] of originating adress number = number.substring(2, number.length()); s = number.substring(0, 2); // get raw length [digits] of originating adress if (s.compareTo("91") == 0) { orgAdr = "+"; number = number.substring(2, number.length()); } // if //----- digit swap procedure for the number n = 0; if (len % 2 != 0) { number = number.substring(0, number.length()-1); // shorten number in case of wrong number format } // if do { orgAdr += number.substring(n+1, n+2) + number.substring(n, n+1); n += 2; } while (n < number.length()); return orgAdr; } // decodeAddressField /** * Convert a Unicode text string into the GSM standard alphabet * @param msg text string in ASCII * @return text string in GSM standard alphabet */ public static byte[] convertUnicode2GSM(String msg) { byte[] data = new byte[msg.length()]; for (int i = 0; i < msg.length(); i++) { switch (msg.charAt(i)) { case '@': data[i] = 0x00; break; case '$': data[i] = 0x02; break; case '\n': data[i] = 0x0A; break; case '\r': data[i] = 0x0D; break; case '_': data[i] = 0x11; break; case '
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -