com.artos.utils.Transform Maven / Gradle / Ivy
/*******************************************************************************
* Copyright (C) 2018 Arpit Shah
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
******************************************************************************/
package com.artos.utils;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import com.artos.framework.Enums.ExceptionValue;
/**
*
*
*
*/
public class Transform {
static final String HEXES = "0123456789ABCDEF";
static final ByteOrder BYTE_ORDER_DEFAULT = ByteOrder.LITTLE_ENDIAN;
// ===================================================================
// Bytes related manipulation
// ===================================================================
/**
* concatenates multiple byte arrays.
*
* @param arrays = byte arrays
* @return concatenated byte array
*/
public byte[] concat(byte[]... arrays) {
int totalLength = 0;
for (byte[] array : arrays) {
totalLength += array.length;
}
byte[] result = new byte[totalLength];
int offset = 0;
for (byte[] array : arrays) {
System.arraycopy(array, 0, result, offset, array.length);
offset += array.length;
}
return result;
}
/**
* concatenate chain of single byte in order it was provided in.
*
* @param data = byte(s) in sequence
* @return concatenated byte array
*/
@SuppressWarnings("unused")
public byte[] concat(byte... data) {
int totalLength = 0;
for (byte currentByte : data) {
totalLength += 1;
}
byte[] result = new byte[totalLength];
int offset = 0;
for (byte currentByte : data) {
result[offset] = currentByte;
offset++;
}
return result;
}
/**
* concatenates byte array with subsequent single byte in order it was provided in.
*
* @param byteArray = first byte array
* @param rest = following byte array
* @return = concatenated byte array
*/
@SuppressWarnings("unused")
public byte[] concat(byte[] byteArray, byte... rest) {
int totalLength = byteArray.length;
for (byte currentByte : rest) {
totalLength += 1;
}
byte[] result = Arrays.copyOf(byteArray, totalLength);
int offset = byteArray.length;
for (byte currentByte : rest) {
result[offset] = currentByte;
offset++;
}
return result;
}
/**
* concatenates byte with subsequent byte arrays in order it was provided in.
*
* @param data = first byte
* @param rest = following byte array
* @return = concatenated byte array
*/
public byte[] concat(byte data, byte[]... rest) {
int totalLength = 1;
for (byte[] array : rest) {
totalLength += array.length;
}
byte[] result = new byte[totalLength];
result[0] = data;
int offset = 1;
for (byte[] array : rest) {
System.arraycopy(array, 0, result, offset, array.length);
offset += array.length;
}
return result;
}
/**
* Converts Byte to Hex String
*
*
* Example:
* Sample : bytesToHexString((byte)0xFF);
* Result : FF
*
*
* @param data = data to be converted
* @return Hex formatted string
*/
public String bytesToHexString(byte data) {
return bytesToHexString(data, false);
}
/**
* Converts Bytes to Hex String
*
*
* Example:
* Sample : bytesToHexString(new byte[]{0x01, 0x02, 0xFF});
* Result : 0102FF
*
*
* @param data = data to be converted
* @return Hex formatted string
*/
public String bytesToHexString(byte[] data) {
return bytesToHexString(data, false);
}
/**
* Converts Bytes to Hex String
*
*
* Example:
* Sample : bytesToHexString(new byte[]{0x01, 0x02, 0xFF}, true);
* Result : [3][01 02 FF]
* Sample : bytesToHexString(new byte[]{0x01, 0x02, 0xFF}, false);
* Result : 0102FF
*
*
* @param data = data to be converted
* @param bDisplaySize = true/false
* @return Hex formatted string
*/
public String bytesToHexString(byte[] data, boolean bDisplaySize) {
if (null == data) {
throw new NullPointerException();
}
StringBuilder hex = new StringBuilder();
if (bDisplaySize) {
hex.append("[" + data.length + "][");
}
int count = 1;
for (byte b : data) {
hex.append(HEXES.charAt((b & 0xF0) >> 4)).append(HEXES.charAt((b & 0x0F)));
if (bDisplaySize && count < data.length) {
hex.append(" ");
}
count++;
}
if (bDisplaySize) {
hex.append("]");
}
return hex.toString();
}
/**
* Converts Byte to Hex String
*
*
* Example:
* Sample : bytesToHexString((byte)0xFF, true);
* Result : [1][FF]
* Sample : bytesToHexString((byte)0xFF, false);
* Result : FF
*
*
* @param data = data to be converted
* @param bDisplaySize = true/false
* @return Hex formatted string
*/
public String bytesToHexString(byte data, boolean bDisplaySize) {
return bytesToHexString(new byte[] { data }, bDisplaySize);
}
/**
*
* Sample : bytesToAscii(new byte[]{(byte)0x54,(byte)0x45,(byte)0x53,(byte)0x54});
* Answer : TEST
*
*
* @param data = data to be converted
* @return = Ascii formatted String
* @throws UnsupportedEncodingException Exception is thrown if invalid input is provided
*/
public String bytesToAscii(byte[] data) throws UnsupportedEncodingException {
return new String(data, "UTF-8");
}
/**
*
* Sample : bytesToAscii((byte)0x54);
* Answer : T
*
*
* @param data = data to be converted
* @return = Ascii formatted String
* @throws Exception = Exception is returned if invalid input data is provided
*/
public String bytesToAscii(byte data) throws Exception {
return bytesToAscii(new byte[] { data });
}
/**
*
* @param byteArray Reads the first eight bytes, composing them into a long value according to the byte order
* @return long value
*/
public long bytesToLong(byte[] byteArray) {
return bytesToLong(byteArray, BYTE_ORDER_DEFAULT);
}
/**
*
* Sample : bytesToLong(new byte[]{0D, E0, B6, B3, A7, 63, FF, FF}, ByteOrder.BIG_ENDIAN);
* Answer : 999999999999999999
*
*
* @param bytes = data to be converted
* @param bo byte order before converting it to long
* @return = long formatted data
*/
public long bytesToLong(byte[] bytes, ByteOrder bo) {
ByteBuffer buffer = ByteBuffer.wrap(bytes);
buffer.order(bo);
return buffer.getLong();
}
/**
*
* Sample : bytesToDecimals(new byte[]{00, 00, 00, 03});
* Answer : 3
*
*
* @param bytes = data to be converted
* @return = long formatted data
*/
public long bytesToDecimals(byte[] bytes) {
return bytesToDecimals(bytes, ByteOrder.BIG_ENDIAN);
}
/**
*
* Sample : bytesToDecimals(new byte[]{00, 00, 00, 03}, ByteOrder.BIG_ENDIAN);
* Sample : bytesToDecimals(new byte[]{03, 00, 00, 00}, ByteOrder.LITTLE_ENDIAN);
* Answer : 3
*
*
* @param bytes = data to be converted
* @param bo byte order before converting it to long
* @return = long formatted data
*/
public long bytesToDecimals(byte[] bytes, ByteOrder bo) {
int size = 8;
byte[] temp = new byte[size];
Arrays.fill(temp, (byte) 0x00);
if (bo == ByteOrder.BIG_ENDIAN) {
for (int i = bytes.length - 1; i >= 0; i--) {
temp[size - 1] = bytes[i];
size--;
}
} else {
for (int i = 0; i < bytes.length; i++) {
temp[i] = bytes[i];
}
}
return bytesToLong(temp, bo);
}
/**
*
* Sample : bytesToInteger(new byte[]{00, 00, 00, 03}, ByteOrder.BIG_ENDIAN);
* Answer : 3
*
*
* @param bytes = data to be converted
* @param bo byte order before converting it to long
* @return = integer formatted data
*/
public int bytesToInteger(byte[] bytes, ByteOrder bo) {
ByteBuffer buffer = ByteBuffer.wrap(bytes);
buffer.order(bo);
return buffer.getInt();
}
/**
* @deprecated we recommend to use {@link #bytesToShort(byte[], ByteOrder)} instead
* @param bytes Byte array
* @param bo Byte order
* @return Integer value
*/
@Deprecated
public int bytes2ToInt(byte[] bytes, ByteOrder bo) {
return bytesToShort(bytes, bo);
}
/**
*
* @param bytes Byte array
* @param bo Byte order
* @return Short value
*/
public short bytesToShort(byte[] bytes, ByteOrder bo) {
ByteBuffer buffer = ByteBuffer.wrap(bytes);
buffer.order(bo);
return buffer.getShort();
}
/**
* Generates requested number of random bytes. Uses SecureRandom function
*
* @param numberOfBytes Number of bytes
* @return random number byte array
*/
public byte[] generateRandomBytes(int numberOfBytes) {
SecureRandom random = new SecureRandom();
byte[] bytes = new byte[numberOfBytes];
random.nextBytes(bytes);
return bytes;
}
/**
* Reverse order of bytes
*
* @param data Byte array
* @return reversed byte array
*/
public byte[] bytesReverseOrder(byte[] data) {
byte[] reverseData = new byte[data.length];
int j = data.length - 1;
for (int i = 0; i < data.length; i++) {
reverseData[j] = data[i];
j--;
}
return reverseData;
}
/**
*
* @param list List of byte
* @return byte array
*/
public byte[] listToByteArray(List list) {
byte[] byteArray = new byte[list.size()];
for (int i = 0; i < list.size(); i++) {
byteArray[i] = list.get(i).byteValue();
}
return byteArray;
}
// ===================================================================
// Bits related manipulation
// ===================================================================
/**
* Returns Low Nibble of the byte.
*
*
* Sample : getLowNibble((byte)0xFF)
* Answer : 0xF0
*
*
* @param data Byte value
* @return Low Nibble in byte format
*/
public byte getLowNibble(byte data) {
byte lowNibble = (byte) (data & 0x0F);
return lowNibble;
}
/**
* Returns High Nibble of the byte.
*
*
* Sample : getLowNibble((byte)0xFF)
* Answer : 0x0F
*
*
* @param data Byte Value
* @return High Nibble in byte format
*/
public byte getHighNibble(byte data) {
byte lowNibble = (byte) ((data >> 4) & 0x0F);
return lowNibble;
}
/**
* Sets Particular bit of the byte to high
*
* @param data Byte Value
* @param pos Bit position
* @return Byte with set bit
*/
public byte setBitOfTheByte(byte data, int pos) {
return (byte) (data | (1 << pos));
}
/**
* Sets Particular bit of the byte to low
*
* @param data Byte Value
* @param pos Bit Position
* @return Byte with cleated bit
*/
public byte clearBitOfTheByte(byte data, int pos) {
return (byte) (data & ~(1 << pos));
}
/**
* Toggles particular bit of the byte
*
* @param data Byte value
* @param pos Bit position
* @return Byte with toogled bit
*/
public byte toogleBitOfTheByte(byte data, int pos) {
return (byte) (data ^ (1 << pos));
}
/**
* Returns particular bit of the byte
*
* @param data Byte value
* @param pos Bit Position
* @return Value of the Bit (1 or 0)
*/
public int getBitOfTheByte(byte data, int pos) {
return 0 != (data & (0x01 << pos)) ? 1 : 0;
}
public boolean isBitSet(byte data, int pos) {
if (0 != getBitOfTheByte(data, pos)) {
return true;
}
return false;
}
// ===================================================================
// String related manipulation
// ===================================================================
public byte[] strToByteArray(String str) {
return str.getBytes();
}
public byte strHexToByte(String strHex) {
if (strHex.length() != 2) {
throw new IllegalArgumentException("Input string must only contain 2 char");
}
return (strHexToByteArray(strHex)[0]);
}
public byte[] strHexToByteArray(String strHex) {
return strHexToByteArray(strHex, true);
}
public byte[] strHexToByteArray(String strHex, boolean removeWhiteSpaceChar) {
String s = strHex;
if (removeWhiteSpaceChar) {
s = strHex.replaceAll("\\s", "");
}
if ((s.length() % 2) != 0) {
throw new IllegalArgumentException("Input string must contain an even number of characters");
}
byte data[] = new byte[s.length() / 2];
for (int i = 0; i < s.length(); i += 2) {
data[i / 2] = (Integer.decode("0x" + s.charAt(i) + s.charAt(i + 1))).byteValue();
}
return data;
}
public byte[] strAsciiToByteArray(String strAscii) {
return strAscii.getBytes();
}
public int strToInt(String string) {
return Integer.parseInt(string);
}
/**
* Converts String Hex to ASCII
*
* @param strHex Hex formatter string
* @return ASCII String
* @throws UnsupportedEncodingException Exception is thrown if invalid input is provided
*/
public String strHexToAscii(String strHex) throws UnsupportedEncodingException {
if (strHex == null || strHex.length() % 2 != 0) {
throw new RuntimeException("Invalid data, null or odd length");
}
int len = strHex.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(strHex.charAt(i), 16) << 4) + Character.digit(strHex.charAt(i + 1), 16));
}
return bytesToAscii(data);
}
/**
*
* @param asciiValue ASCII string
* @return Hex String
*/
public String asciiToHexString(String asciiValue) {
String result = "";
byte[] asciiArray = asciiValue.getBytes();
for (byte s : asciiArray) {
result += String.format("%02x", s);
}
return result;
}
public String strEscapeForXML(String input) {
StringBuilder builder = new StringBuilder();
for (int index = 0; index < input.length(); index++) {
char chr = input.charAt(index);
if (chr == '<') {
builder.append("<");
} else if (chr == '>') {
builder.append(">");
} else if (chr == '&') {
builder.append("&");
} else if (chr == '\'') {
builder.append("'");
} else if (chr == '"') {
builder.append(""");
} else {
builder.append(chr);
}
}
return builder.toString();
}
// ===================================================================
// Long related manipulation
// ===================================================================
public byte[] longTo8Bytes(long x, ByteOrder bo) {
ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
buffer.order(bo);
buffer.putLong(x);
return buffer.array();
}
// ===================================================================
// Integer related manipulation
// ===================================================================
public boolean isInteger(String str) {
try {
Integer.parseInt(str);
} catch (NumberFormatException e) {
return false;
}
return true;
}
public byte[] intToByteArray(int x, ByteOrder bo) {
ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES);
buffer.order(bo);
buffer.putInt(x);
return buffer.array();
}
public byte[] intToByteArray(int x) {
return intToByteArray(x, BYTE_ORDER_DEFAULT);
}
public byte intToByte(int x) {
return (byte) x;
}
public String intToString(int x) {
return Integer.toString(x);
}
/**
* Returns fix length string regardless of integer value
*
* @param nNumber Integer value
* @param nFixLenght String length
* @return Fix length string
*/
public String intToFixLengthString(int nNumber, int nFixLenght) {
String numberAsString = String.format("%0" + nFixLenght + "d", nNumber);
return numberAsString;
}
// ===================================================================
// Boolean related manipulation
// ===================================================================
/**
*
* @param b Boolean value
* @return integer representation of boolean value
*/
public int booleanToInt(boolean b) {
return b ? 1 : 0;
}
public String booleanToStr(boolean b) {
return b ? "1" : "0";
}
public String booleanToStringBoolean(boolean b) {
return String.valueOf(b);
}
public boolean stringToBoolean(String str) throws Exception {
if (str.trim().equals("1") || str.trim().toLowerCase().equals("true")) {
return true;
} else if (str.trim().equals("0") || str.trim().toLowerCase().equals("false")) {
return false;
}
throw new Exception(ExceptionValue.INVALID_INPUT.getValue());
}
// *******************************************************************************************
// Time related manipulation
// *******************************************************************************************
/**
* MilliSecondsToFormattedDate("dd-MM-yyyy hh:mm", System.milliseconds())
*
* @param dateFormat the pattern describing the date and time format
* @param timeInMilliseconds EPoch time value
* @return date formatter with given pattern
*/
public String MilliSecondsToFormattedDate(String dateFormat, long timeInMilliseconds) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeInMilliseconds);
return simpleDateFormat.format(calendar.getTime());
}
public long getCurrentEPOCHTime() throws Exception {
Date date = new Date();
return getEPOCHTime(date);
}
public long getEPOCHTime(Date date) throws Exception {
return date.getTime() / 1000;
}
@SuppressWarnings("deprecation")
public long getEPOCHTime(String timeddMMyyyyHHmmss) throws Exception {
// String str = "Jun 13 2003 23:11:52.454";
SimpleDateFormat df = new SimpleDateFormat("ddMMyyyyHHmmss");
Date date = df.parse(timeddMMyyyyHHmmss);
// EPOCH returns time in milliseconds so divide by 1000
// System.out.println("EPOCHTime :" +
// ((date.getTime()-date.getTimezoneOffset()) / 1000));
return ((date.getTime() - date.getTimezoneOffset()) / 1000);
}
public Calendar getDateFromEPOCHTime(long epochTime) throws Exception {
Date date = new Date(epochTime);
SimpleDateFormat format = new SimpleDateFormat("dd MM yyyy HH:mm:ss.SSS");
String formattedDate = format.format(date);
System.out.println("date :" + formattedDate);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal;
}
public String getCurrentTimeZone() {
TimeZone tz = Calendar.getInstance().getTimeZone();
return tz.getID();
}
// ===================================================================
// Other manipulation
// ===================================================================
/**
* Generate Random number between provided high and low value
*
* @param low random number low boundary
* @param high random number high boundary
* @return random integer value between high and low boundary
*/
public int randInt(int low, int high) {
SecureRandom r = new SecureRandom();
int R = r.nextInt(high - low) + low;
return R;
}
/**
* Generate Random long number
*
* @return random long value
*/
public long randLong() {
SecureRandom r = new SecureRandom();
long R = r.nextLong();
return R;
}
/**
* Generate Random char array
*
* @param length Char array length
* @return random char array
*/
public char[] randChar(int length) {
SecureRandom r = new SecureRandom();
char[] chars = new char[length];
for (int i = 0; i < length; i++) {
chars[i] = (char) (r.nextInt(26) + 'a');
}
return chars;
}
/**
* Generate Random char String
*
* @param length String length
* @return random character string
*/
public String randString(int length) {
return String.valueOf(randChar(length));
}
/**
* Generate Random byte array
*
* @param length Byte array length
* @return random value byte array
*/
public byte[] randBytes(int length) {
byte[] b = new byte[length];
SecureRandom r = new SecureRandom();
r.nextBytes(b);
return b;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy