Main.java Source code

Java tutorial

Introduction

Here is the source code for Main.java

Source

//package com.java2s;
//PduUtils is distributed under the terms of the Apache License version 2.0

import java.util.*;

public class Main {
    private static final char[] extAlphabet = { '\u000c', // FORM FEED
            '\u005e', // CIRCUMFLEX ACCENT
            '\u007b', // LEFT CURLY BRACKET
            '\u007d', // RIGHT CURLY BRACKET
            '\\', // REVERSE SOLIDUS
            '\u005b', // LEFT SQUARE BRACKET
            '\u007e', // TILDE
            '\u005d', // RIGHT SQUARE BRACKET
            '\u007c', // VERTICAL LINES
            '\u20ac', // EURO SIGN
    };
    private static final String[] extBytes = { "1b0a", // FORM FEED
            "1b14", // CIRCUMFLEX ACCENT
            "1b28", // LEFT CURLY BRACKET
            "1b29", // RIGHT CURLY BRACKET
            "1b2f", // REVERSE SOLIDUS
            "1b3c", // LEFT SQUARE BRACKET
            "1b3d", // TILDE
            "1b3e", // RIGHT SQUARE BRACKET
            "1b40", // VERTICAL LINES
            "1b65", // EURO SIGN
    };
    private static final char[] stdAlphabet = { '\u0040', // COMMERCIAL AT
            '\u00A3', // POUND SIGN
            '\u0024', // DOLLAR SIGN
            '\u00A5', // YEN SIGN
            '\u00E8', // LATIN SMALL LETTER E WITH GRAVE
            '\u00E9', // LATIN SMALL LETTER E WITH ACUTE
            '\u00F9', // LATIN SMALL LETTER U WITH GRAVE
            '\u00EC', // LATIN SMALL LETTER I WITH GRAVE
            '\u00F2', // LATIN SMALL LETTER O WITH GRAVE
            '\u00E7', // LATIN SMALL LETTER C WITH CEDILLA
            '\n', // LINE FEED
            '\u00D8', // LATIN CAPITAL LETTER O WITH STROKE
            '\u00F8', // LATIN SMALL LETTER O WITH STROKE
            '\r', // CARRIAGE RETURN
            '\u00C5', // LATIN CAPITAL LETTER A WITH RING ABOVE
            '\u00E5', // LATIN SMALL LETTER A WITH RING ABOVE
            '\u0394', // GREEK CAPITAL LETTER DELTA
            '\u005F', // LOW LINE
            '\u03A6', // GREEK CAPITAL LETTER PHI
            '\u0393', // GREEK CAPITAL LETTER GAMMA
            '\u039B', // GREEK CAPITAL LETTER LAMDA
            '\u03A9', // GREEK CAPITAL LETTER OMEGA
            '\u03A0', // GREEK CAPITAL LETTER PI
            '\u03A8', // GREEK CAPITAL LETTER PSI
            '\u03A3', // GREEK CAPITAL LETTER SIGMA
            '\u0398', // GREEK CAPITAL LETTER THETA
            '\u039E', // GREEK CAPITAL LETTER XI
            '\u00A0', // ESCAPE TO EXTENSION TABLE (or displayed as NBSP, see
            // note
            // above)
            '\u00C6', // LATIN CAPITAL LETTER AE
            '\u00E6', // LATIN SMALL LETTER AE
            '\u00DF', // LATIN SMALL LETTER SHARP S (German)
            '\u00C9', // LATIN CAPITAL LETTER E WITH ACUTE
            '\u0020', // SPACE
            '\u0021', // EXCLAMATION MARK
            '\u0022', // QUOTATION MARK
            '\u0023', // NUMBER SIGN
            '\u00A4', // CURRENCY SIGN
            '\u0025', // PERCENT SIGN
            '\u0026', // AMPERSAND
            '\'', // APOSTROPHE
            '\u0028', // LEFT PARENTHESIS
            '\u0029', // RIGHT PARENTHESIS
            '\u002A', // ASTERISK
            '\u002B', // PLUS SIGN
            '\u002C', // COMMA
            '\u002D', // HYPHEN-MINUS
            '\u002E', // FULL STOP
            '\u002F', // SOLIDUS
            '\u0030', // DIGIT ZERO
            '\u0031', // DIGIT ONE
            '\u0032', // DIGIT TWO
            '\u0033', // DIGIT THREE
            '\u0034', // DIGIT FOUR
            '\u0035', // DIGIT FIVE
            '\u0036', // DIGIT SIX
            '\u0037', // DIGIT SEVEN
            '\u0038', // DIGIT EIGHT
            '\u0039', // DIGIT NINE
            '\u003A', // COLON
            '\u003B', // SEMICOLON
            '\u003C', // LESS-THAN SIGN
            '\u003D', // EQUALS SIGN
            '\u003E', // GREATER-THAN SIGN
            '\u003F', // QUESTION MARK
            '\u00A1', // INVERTED EXCLAMATION MARK
            '\u0041', // LATIN CAPITAL LETTER A
            '\u0042', // LATIN CAPITAL LETTER B
            '\u0043', // LATIN CAPITAL LETTER C
            '\u0044', // LATIN CAPITAL LETTER D
            '\u0045', // LATIN CAPITAL LETTER E
            '\u0046', // LATIN CAPITAL LETTER F
            '\u0047', // LATIN CAPITAL LETTER G
            '\u0048', // LATIN CAPITAL LETTER H
            '\u0049', // LATIN CAPITAL LETTER I
            '\u004A', // LATIN CAPITAL LETTER J
            '\u004B', // LATIN CAPITAL LETTER K
            '\u004C', // LATIN CAPITAL LETTER L
            '\u004D', // LATIN CAPITAL LETTER M
            '\u004E', // LATIN CAPITAL LETTER N
            '\u004F', // LATIN CAPITAL LETTER O
            '\u0050', // LATIN CAPITAL LETTER P
            '\u0051', // LATIN CAPITAL LETTER Q
            '\u0052', // LATIN CAPITAL LETTER R
            '\u0053', // LATIN CAPITAL LETTER S
            '\u0054', // LATIN CAPITAL LETTER T
            '\u0055', // LATIN CAPITAL LETTER U
            '\u0056', // LATIN CAPITAL LETTER V
            '\u0057', // LATIN CAPITAL LETTER W
            '\u0058', // LATIN CAPITAL LETTER X
            '\u0059', // LATIN CAPITAL LETTER Y
            '\u005A', // LATIN CAPITAL LETTER Z
            '\u00C4', // LATIN CAPITAL LETTER A WITH DIAERESIS
            '\u00D6', // LATIN CAPITAL LETTER O WITH DIAERESIS
            '\u00D1', // LATIN CAPITAL LETTER N WITH TILDE
            '\u00DC', // LATIN CAPITAL LETTER U WITH DIAERESIS
            '\u00A7', // SECTION SIGN
            '\u00BF', // INVERTED QUESTION MARK
            '\u0061', // LATIN SMALL LETTER A
            '\u0062', // LATIN SMALL LETTER B
            '\u0063', // LATIN SMALL LETTER C
            '\u0064', // LATIN SMALL LETTER D
            '\u0065', // LATIN SMALL LETTER E
            '\u0066', // LATIN SMALL LETTER F
            '\u0067', // LATIN SMALL LETTER G
            '\u0068', // LATIN SMALL LETTER H
            '\u0069', // LATIN SMALL LETTER I
            '\u006A', // LATIN SMALL LETTER J
            '\u006B', // LATIN SMALL LETTER K
            '\u006C', // LATIN SMALL LETTER L
            '\u006D', // LATIN SMALL LETTER M
            '\u006E', // LATIN SMALL LETTER N
            '\u006F', // LATIN SMALL LETTER O
            '\u0070', // LATIN SMALL LETTER P
            '\u0071', // LATIN SMALL LETTER Q
            '\u0072', // LATIN SMALL LETTER R
            '\u0073', // LATIN SMALL LETTER S
            '\u0074', // LATIN SMALL LETTER T
            '\u0075', // LATIN SMALL LETTER U
            '\u0076', // LATIN SMALL LETTER V
            '\u0077', // LATIN SMALL LETTER W
            '\u0078', // LATIN SMALL LETTER X
            '\u0079', // LATIN SMALL LETTER Y
            '\u007A', // LATIN SMALL LETTER Z
            '\u00E4', // LATIN SMALL LETTER A WITH DIAERESIS
            '\u00F6', // LATIN SMALL LETTER O WITH DIAERESIS
            '\u00F1', // LATIN SMALL LETTER N WITH TILDE
            '\u00FC', // LATIN SMALL LETTER U WITH DIAERESIS
            '\u00E0', // LATIN SMALL LETTER A WITH GRAVE
    };

    public static String encodedSeptetsToString(byte[] encodedSeptets) {
        return unencodedSeptetsToString(encodedSeptetsToUnencodedSeptets(encodedSeptets));
    }

    public static String unencodedSeptetsToString(byte[] bytes) {
        StringBuffer text;
        String extChar;
        int i, j;
        text = new StringBuffer();
        for (i = 0; i < bytes.length; i++) {
            if (bytes[i] == 0x1b) {
                // NOTE: - ++i can be a problem if the '1b'
                //         is right at the end of a PDU
                //       - this will be an issue for displaying 
                //         partial PDUs e.g. via toString()
                if (i < bytes.length - 1) {
                    extChar = "1b" + Integer.toHexString(bytes[++i]);
                    for (j = 0; j < extBytes.length; j++)
                        if (extBytes[j].equalsIgnoreCase(extChar))
                            text.append(extAlphabet[j]);
                }
            } else {
                text.append(stdAlphabet[bytes[i]]);
            }
        }
        return text.toString();
    }

    public static byte[] encodedSeptetsToUnencodedSeptets(byte[] octetBytes) {
        return encodedSeptetsToUnencodedSeptets(octetBytes, true);
    }

    public static byte[] encodedSeptetsToUnencodedSeptets(byte[] octetBytes, boolean discardLast) {
        byte newBytes[];
        BitSet bitSet;
        int i, j, value1, value2;
        bitSet = new BitSet(octetBytes.length * 8);
        value1 = 0;
        for (i = 0; i < octetBytes.length; i++)
            for (j = 0; j < 8; j++) {
                value1 = (i * 8) + j;
                if ((octetBytes[i] & (1 << j)) != 0)
                    bitSet.set(value1);
            }
        value1++;
        // this is a bit count NOT a byte count
        value2 = value1 / 7 + ((value1 % 7 != 0) ? 1 : 0); // big diff here
        //System.out.println(octetBytes.length);
        //System.out.println(value1+" --> "+value2);
        if (value2 == 0)
            value2++;
        newBytes = new byte[value2];
        for (i = 0; i < value2; i++) {
            for (j = 0; j < 7; j++) {
                if ((value1 + 1) > (i * 7 + j)) {
                    if (bitSet.get(i * 7 + j)) {
                        newBytes[i] |= (byte) (1 << j);
                    }
                }
            }
        }
        if (discardLast && octetBytes.length * 8 % 7 > 0) {
            // when decoding a 7bit encoded string 
            // the last septet may become 0, this should be discarded
            // since this is an artifact of the encoding not part of the 
            // original string
            // this is only done for decoding 7bit encoded text NOT for
            // reversing octets to septets (e.g. for the encoding the UDH)
            if (newBytes[newBytes.length - 1] == 0) {
                byte[] retVal = new byte[newBytes.length - 1];
                System.arraycopy(newBytes, 0, retVal, 0, retVal.length);
                return retVal;
            }
        }
        return newBytes;
    }
}