📄 util.java
字号:
package test.des2.tt;
// ----------------------------------------------------------------------------
// $Id: Util.java,v 1.11 2005/10/06 04:24:19 rsdio Exp $
//
// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
//
// This file is part of GNU Crypto.
//
// GNU Crypto is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2, or (at your option)
// any later version.
//
// GNU Crypto is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; see the file COPYING. If not, write to the
//
// Free Software Foundation Inc.,
// 51 Franklin Street, Fifth Floor,
// Boston, MA 02110-1301
// USA
//
// Linking this library statically or dynamically with other modules is
// making a combined work based on this library. Thus, the terms and
// conditions of the GNU General Public License cover the whole
// combination.
//
// As a special exception, the copyright holders of this library give
// you permission to link this library with independent modules to
// produce an executable, regardless of the license terms of these
// independent modules, and to copy and distribute the resulting
// executable under terms of your choice, provided that you also meet,
// for each linked independent module, the terms and conditions of the
// license of that module. An independent module is a module which is
// not derived from or based on this library. If you modify this
// library, you may extend this exception to your version of the
// library, but you are not obligated to do so. If you do not wish to
// do so, delete this exception statement from your version.
// ----------------------------------------------------------------------------
import java.math.BigInteger;
/**
* <p>A collection of utility methods used throughout this project.</p>
*
* @version $Revision: 1.11 $
*/
public class Util {
// Constants and variables
// -------------------------------------------------------------------------
// Hex charset
private static final char[] HEX_DIGITS = "0123456789ABCDEF".toCharArray();
// Base-64 charset
private static final String BASE64_CHARS =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./";
private static final char[] BASE64_CHARSET = BASE64_CHARS.toCharArray();
// Constructor(s)
// -------------------------------------------------------------------------
/** Trivial constructor to enforce Singleton pattern. */
private Util() {
super();
}
// Class methods
// -------------------------------------------------------------------------
/**
* <p>Returns a string of hexadecimal digits from a byte array. Each byte is
* converted to 2 hex symbols; zero(es) included.</p>
*
* <p>This method calls the method with same name and three arguments as:</p>
*
* <pre>
* toString(ba, 0, ba.length);
* </pre>
*
* @param ba the byte array to convert.
* @return a string of hexadecimal characters (two for each byte)
* representing the designated input byte array.
*/
public static String toString(byte[] ba) {
return toString(ba, 0, ba.length);
}
/**
* <p>Returns a string of hexadecimal digits from a byte array, starting at
* <code>offset</code> and consisting of <code>length</code> bytes. Each byte
* is converted to 2 hex symbols; zero(es) included.</p>
*
* @param ba the byte array to convert.
* @param offset the index from which to start considering the bytes to
* convert.
* @param length the count of bytes, starting from the designated offset to
* convert.
* @return a string of hexadecimal characters (two for each byte)
* representing the designated input byte sub-array.
*/
public static final String toString(byte[] ba, int offset, int length) {
char[] buf = new char[length * 2];
for (int i = 0, j = 0, k; i < length; ) {
k = ba[offset + i++];
buf[j++] = HEX_DIGITS[(k >>> 4) & 0x0F];
buf[j++] = HEX_DIGITS[ k & 0x0F];
}
return new String(buf);
}
/**
* <p>Returns a string of hexadecimal digits from a byte array. Each byte is
* converted to 2 hex symbols; zero(es) included. The argument is
* treated as a large little-endian integer and is returned as a
* large big-endian integer.</p>
*
* <p>This method calls the method with same name and three arguments as:</p>
*
* <pre>
* toReversedString(ba, 0, ba.length);
* </pre>
*
* @param ba the byte array to convert.
* @return a string of hexadecimal characters (two for each byte)
* representing the designated input byte array.
*/
public static String toReversedString(byte[] ba) {
return toReversedString(ba, 0, ba.length);
}
/**
* <p>Returns a string of hexadecimal digits from a byte array, starting at
* <code>offset</code> and consisting of <code>length</code> bytes. Each byte
* is converted to 2 hex symbols; zero(es) included.</p>
*
* <p>The byte array is treated as a large little-endian integer, and
* is returned as a large big-endian integer.</p>
*
* @param ba the byte array to convert.
* @param offset the index from which to start considering the bytes to
* convert.
* @param length the count of bytes, starting from the designated offset to
* convert.
* @return a string of hexadecimal characters (two for each byte)
* representing the designated input byte sub-array.
*/
public static final String
toReversedString(byte[] ba, int offset, int length) {
char[] buf = new char[length * 2];
for (int i = offset+length-1, j = 0, k; i >= offset; ) {
k = ba[offset + i--];
buf[j++] = HEX_DIGITS[(k >>> 4) & 0x0F];
buf[j++] = HEX_DIGITS[ k & 0x0F];
}
return new String(buf);
}
/**
* <p>Returns a byte array from a string of hexadecimal digits.</p>
*
* @param s a string of hexadecimal ASCII characters
* @return the decoded byte array from the input hexadecimal string.
*/
public static byte[] toBytesFromString(String s) {
int limit = s.length();
byte[] result = new byte[((limit + 1) / 2)];
int i = 0, j = 0;
if ((limit % 2) == 1) {
result[j++] = (byte) fromDigit(s.charAt(i++));
}
while (i < limit) {
result[j ] = (byte) (fromDigit(s.charAt(i++)) << 4);
result[j++] |= (byte) fromDigit(s.charAt(i++));
}
return result;
}
/**
* <p>Returns a byte array from a string of hexadecimal digits, interpreting
* them as a large big-endian integer and returning it as a large
* little-endian integer.</p>
*
* @param s a string of hexadecimal ASCII characters
* @return the decoded byte array from the input hexadecimal string.
*/
public static byte[] toReversedBytesFromString(String s) {
int limit = s.length();
byte[] result = new byte[((limit + 1) / 2)];
int i = 0;
if ((limit % 2) == 1) {
result[i++] = (byte) fromDigit(s.charAt(--limit));
}
while (limit > 0) {
result[i ] = (byte) fromDigit(s.charAt(--limit));
result[i++] |= (byte) (fromDigit(s.charAt(--limit)) << 4);
}
return result;
}
/**
* <p>Returns a number from <code>0</code> to <code>15</code> corresponding
* to the designated hexadecimal digit.</p>
*
* @param c a hexadecimal ASCII symbol.
*/
public static int fromDigit(char c) {
if (c >= '0' && c <= '9') {
return c - '0';
} else if (c >= 'A' && c <= 'F') {
return c - 'A' + 10;
} else if (c >= 'a' && c <= 'f') {
return c - 'a' + 10;
} else
throw new IllegalArgumentException("Invalid hexadecimal digit: " + c);
}
/**
* <p>Returns a string of 8 hexadecimal digits (most significant digit first)
* corresponding to the unsigned integer <code>n</code>.</p>
*
* @param n the unsigned integer to convert.
* @return a hexadecimal string 8-character long.
*/
public static String toString(int n) {
char[] buf = new char[8];
for (int i = 7; i >= 0; i--) {
buf[i] = HEX_DIGITS[n & 0x0F];
n >>>= 4;
}
return new String(buf);
}
/**
* <p>Returns a string of hexadecimal digits from an integer array. Each int
* is converted to 4 hex symbols.</p>
*/
public static String toString(int[] ia) {
int length = ia.length;
char[] buf = new char[length * 8];
for (int i = 0, j = 0, k; i < length; i++) {
k = ia[i];
buf[j++] = HEX_DIGITS[(k >>> 28) & 0x0F];
buf[j++] = HEX_DIGITS[(k >>> 24) & 0x0F];
buf[j++] = HEX_DIGITS[(k >>> 20) & 0x0F];
buf[j++] = HEX_DIGITS[(k >>> 16) & 0x0F];
buf[j++] = HEX_DIGITS[(k >>> 12) & 0x0F];
buf[j++] = HEX_DIGITS[(k >>> 8) & 0x0F];
buf[j++] = HEX_DIGITS[(k >>> 4) & 0x0F];
buf[j++] = HEX_DIGITS[ k & 0x0F];
}
return new String(buf);
}
/**
* <p>Returns a string of 16 hexadecimal digits (most significant digit first)
* corresponding to the unsigned long <code>n</code>.</p>
*
* @param n the unsigned long to convert.
* @return a hexadecimal string 16-character long.
*/
public static String toString(long n) {
char[] b = new char[16];
for (int i = 15; i >= 0; i--) {
b[i] = HEX_DIGITS[(int)(n & 0x0FL)];
n >>>= 4;
}
return new String(b);
}
/**
* <p>Similar to the <code>toString()</code> method except that the Unicode
* escape character is inserted before every pair of bytes. Useful to
* externalise byte arrays that will be constructed later from such strings;
* eg. s-box values.</p>
*
* @throws ArrayIndexOutOfBoundsException if the length is odd.
*/
public static String toUnicodeString(byte[] ba) {
return toUnicodeString(ba, 0, ba.length);
}
/**
* <p>Similar to the <code>toString()</code> method except that the Unicode
* escape character is inserted before every pair of bytes. Useful to
* externalise byte arrays that will be constructed later from such strings;
* eg. s-box values.</p>
*
* @throws ArrayIndexOutOfBoundsException if the length is odd.
*/
public static final String
toUnicodeString(byte[] ba, int offset, int length) {
StringBuffer sb = new StringBuffer();
int i = 0;
int j = 0;
int k;
sb.append('\n').append("\"");
while (i < length) {
sb.append("\\u");
k = ba[offset + i++];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -