📄 isoutil.java
字号:
d.append(Character.toUpperCase(hi)); d.append(Character.toUpperCase(lo)); d.append(']'); break; } } else d.append (c); } return d.toString(); } /** * converts a byte array to hex string * (suitable for dumps and ASCII packaging of Binary fields * @param b - byte array * @param offset - starting position * @param len * @return String representation */ public static String hexString(byte[] b, int offset, int len) { StringBuffer d = new StringBuffer(len * 2); len += offset; for (int i=offset; i<len; i++) { char hi = Character.forDigit ((b[i] >> 4) & 0x0F, 16); char lo = Character.forDigit (b[i] & 0x0F, 16); d.append(Character.toUpperCase(hi)); d.append(Character.toUpperCase(lo)); } return d.toString(); } /** * bit representation of a BitSet * suitable for dumps and debugging * @param b - the BitSet * @return string representing the bits (i.e. 011010010...) */ public static String bitSet2String (BitSet b) { int len = b.size(); len = (len > 128) ? 128: len; StringBuffer d = new StringBuffer(len); for (int i=0; i<len; i++) d.append (b.get(i) ? '1' : '0'); return d.toString(); } /** * converts a BitSet into a binary field * used in pack routines * @param b - the BitSet * @return binary representation */ public static byte[] bitSet2byte (BitSet b) { int len = (b.length() > 65) ? 128 : 64; byte[] d = new byte[len >> 3]; for (int i=0; i<len; i++) if (b.get(i+1)) d[i >> 3] |= (0x80 >> (i % 8)); if (len>64) d[0] |= 0x80; return d; } /** * Converts a binary representation of a Bitmap field * into a Java BitSet * @param b - binary representation * @param offset - staring offset * @param bitZeroMeansExtended - true for ISO-8583 * @return java BitSet object */ public static BitSet byte2BitSet (byte[] b, int offset, boolean bitZeroMeansExtended) { int len = bitZeroMeansExtended ? ((b[offset] & 0x80) == 0x80 ? 128 : 64) : 64; BitSet bmap = new BitSet (len); for (int i=0; i<len; i++) if (((b[offset + (i >> 3)]) & (0x80 >> (i % 8))) > 0) bmap.set(i+1); return bmap; } /** * Converts a binary representation of a Bitmap field * into a Java BitSet * @param bmap - BitSet * @param b - hex representation * @param bitOffset - (i.e. 0 for primary bitmap, 64 for secondary) * @return java BitSet object */ public static BitSet byte2BitSet (BitSet bmap, byte[] b, int bitOffset) { int len = b.length << 3; for (int i=0; i<len; i++) if (((b[i >> 3]) & (0x80 >> (i % 8))) > 0) bmap.set(bitOffset + i + 1); return bmap; } /** * Converts an ASCII representation of a Bitmap field * into a Java BitSet * @param b - hex representation * @param offset - staring offset * @param bitZeroMeansExtended - true for ISO-8583 * @return java BitSet object */ public static BitSet hex2BitSet (byte[] b, int offset, boolean bitZeroMeansExtended) { int len = bitZeroMeansExtended ? ((Character.digit((char)b[offset],16) & 0x08) == 8 ? 128 : 64) : 64; BitSet bmap = new BitSet (len); for (int i=0; i<len; i++) { int digit = Character.digit((char)b[offset + (i >> 2)], 16); if ((digit & (0x08 >> (i%4))) > 0) bmap.set(i+1); } return bmap; } /** * Converts an ASCII representation of a Bitmap field * into a Java BitSet * @param bmap - BitSet * @param b - hex representation * @param bitOffset - (i.e. 0 for primary bitmap, 64 for secondary) * @return java BitSet object */ public static BitSet hex2BitSet (BitSet bmap, byte[] b, int bitOffset) { int len = b.length << 2; for (int i=0; i<len; i++) { int digit = Character.digit((char)b[i >> 2], 16); if ((digit & (0x08 >> (i%4))) > 0) bmap.set (bitOffset + i + 1); } return bmap; } /** * @param b source byte array * @param offset starting offset * @param len number of bytes in destination (processes len*2) * @return byte[len] */ public static byte[] hex2byte (byte[] b, int offset, int len) { byte[] d = new byte[len]; for (int i=0; i<len*2; i++) { int shift = i%2 == 1 ? 0 : 4; d[i>>1] |= Character.digit((char) b[offset+i], 16) << shift; } return d; } /** * @param s source string (with Hex representation) * @return byte array */ public static byte[] hex2byte (String s) { return hex2byte (s.getBytes(), 0, s.length() >> 1); } /** * format double value * @param amount the amount * @param fieldLen the field len * @return a String of fieldLen characters (right justified) */ public static String formatDouble(double d, int len) { String prefix = Long.toString((long) d); String suffix = Integer.toString ( (int) ((Math.round(d * 100f)) % 100) ); try { prefix = ISOUtil.padleft(prefix,len-3,' '); suffix = ISOUtil.zeropad(suffix, 2); } catch (ISOException e) { e.printStackTrace(); } return prefix + "." + suffix; } /** * prepare long value used as amount for display * (implicit 2 decimals) * @param l value * @param len display len * @return formated field * @exception ISOException */ public static String formatAmount(long l, int len) throws ISOException { String buf = Long.toString(l); if (l < 100) buf = zeropad(buf, 3); StringBuffer s = new StringBuffer(padleft (buf, len-1, ' ') ); s.insert(len-3, '.'); return s.toString(); } /** * XML normalizer * @param s source String * @param canonical true if we want to normalize \r and \n as well * @return normalized string suitable for XML Output */ public static String normalize (String s, boolean canonical) { StringBuffer str = new StringBuffer(); int len = (s != null) ? s.length() : 0; for (int i = 0; i < len; i++) { char ch = s.charAt(i); switch (ch) { case '<': str.append("<"); break; case '>': str.append(">"); break; case '&': str.append("&"); break; case '"': str.append("""); break; case '\r': case '\n': if (canonical) { str.append("&#"); str.append(Integer.toString(ch)); str.append(';'); break; } // else, default append char default: str.append(ch); } } return (str.toString()); } /** * XML normalizer (default canonical) * @param s source String * @return normalized string suitable for XML Output */ public static String normalize (String s) { return normalize (s, true); } /** * Protects PAN, Track2, CVC (suitable for logs) * <pre> * "40000101010001" is converted to "400001____0001" * "40000101010001=020128375" is converted to "400001____0001=0201_____" * "123" is converted to "___" * </pre> * @param s string to be protected * @return 'protected' String */ public static String protect (String s) { StringBuffer sb = new StringBuffer(); int len = s.length(); int clear = len > 6 ? 6 : 0; int lastFourIndex = -1; if (clear > 0) { lastFourIndex = s.indexOf ('=') - 4; if (lastFourIndex < 0) { lastFourIndex = s.indexOf ('^') - 4; if (lastFourIndex < 0) lastFourIndex = len - 4; } } for (int i=0; i<len; i++) { if (s.charAt(i) == '=') clear = 5; else if (s.charAt(i) == '^') { lastFourIndex = 0; clear = len - i; } else if (i == lastFourIndex) clear = 4; sb.append (clear-- > 0 ? s.charAt(i) : '_'); } return sb.toString(); } public static int[] toIntArray(String s) { StringTokenizer st = new StringTokenizer (s); int[] array = new int [st.countTokens()]; for (int i=0; st.hasMoreTokens(); i++) array[i] = Integer.parseInt (st.nextToken()); return array; } /** * Bitwise XOR between corresponding bytes * @param op1 byteArray1 * @param op2 byteArray2 * @return an array of length = the smallest between op1 and op2 */ public static byte[] xor (byte[] op1, byte[] op2) { byte[] result = null; // Use the smallest array if (op2.length > op1.length) { result = new byte[op1.length]; } else { result = new byte[op2.length]; } for (int i = 0; i < result.length; i++) { result[i] = (byte)(op1[i] ^ op2[i]); } return result; } /** * Trims a byte[] to a certain length * @param array the byte[] to be trimmed * @param length the wanted length * @return the trimmed byte[] */ public static byte[] trim (byte[] array, int length) { byte[] trimmedArray = new byte[length]; System.arraycopy(array, 0, trimmedArray, 0, length); return trimmedArray; } /** * Concatenates two byte arrays (array1 and array2) * @param array1 * @param beginIndex1 * @param length1 * @param array2 * @param beginIndex2 * @param length2 * @return the concatenated array */ public static byte[] concat (byte[] array1, int beginIndex1, int length1, byte[] array2, int beginIndex2, int length2) { byte[] concatArray = new byte[length1 + length2]; System.arraycopy(array1, beginIndex1, concatArray, 0, length1); System.arraycopy(array2, beginIndex2, concatArray, length1, length2); return concatArray; } /** * Causes the currently executing thread to sleep (temporarily cease * execution) for the specified number of milliseconds. The thread * does not lose ownership of any monitors. * * This is the same as Thread.sleep () without throwing InterruptedException * * @param millis the length of time to sleep in milliseconds. */ public static void sleep (long millis) { try { Thread.sleep (millis); } catch (InterruptedException e) { } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -