package org.openstack.atlas.util.converters; import java.util.HashMap; import java.util.Map; public class BitConverters { private static final byte[] hexmap = "0123456789abcdef".getBytes(); public static String int16bit2hex(int i16) { String out; byte[] nibbles = new byte[4]; int i; if (i16 < 0x0000 || i16 > 0xffff) { return null; } nibbles[0] = BitConverters.int2Nibble((i16 & 0xf000) >> 12); nibbles[1] = BitConverters.int2Nibble((i16 & 0x0f00) >> 8); nibbles[2] = BitConverters.int2Nibble((i16 & 0x00f0) >> 4); nibbles[3] = BitConverters.int2Nibble((i16 & 0x000f) >> 0); out = new String(nibbles); return out; } public static int hex16bit2int(String in) { int i; int last; int base; int v; byte[] hex; int out; out = 0; base = 1; if (in == null) { return -1; } hex = in.getBytes(); if (hex.length > 4) { return -1; } last = hex.length - 1; for (i = last; i >= 0; i--) { v = BitConverters.nibble2Int(hex[i]); if (v == -1) { return -1; } out += v * base; base *= 16; } return out; } public static int nibble2Int(byte nibble) { int out; switch (nibble) { case '0': out = 0; break; case '1': out = 1; break; case '2': out = 2; break; case '3': out = 3; break; case '4': out = 4; break; case '5': out = 5; break; case '6': out = 6; break; case '7': out = 7; break; case '8': out = 8; break; case '9': out = 9; break; case 'a': out = 10; break; case 'b': out = 11; break; case 'c': out = 12; break; case 'd': out = 13; break; case 'e': out = 14; break; case 'f': out = 15; break; case 'A': out = 10; break; case 'B': out = 11; break; case 'C': out = 12; break; case 'D': out = 13; break; case 'E': out = 14; break; case 'F': out = 15; break; default: out = -1; break; } return out; } public static byte int2Nibble(int in) { return (in < 0 || in > 15) ? (byte) -1 : hexmap[in]; } public static int ubyte2int(byte in) { return (in >= 0) ? (int) in : (int) in + 256; } public static byte int2ubyte(int in) { in &= 0xff; return (in < 128) ? (byte) in : (byte) (in - 256); } public static String byte2hex(byte ubyte) { byte[] nibbleBytes; String out; int num; int lo; int hi; num = ubyte2int(ubyte); lo = ubyte & 0x0f; hi = (ubyte & 0xf0) >> 4; nibbleBytes = new byte[]{int2Nibble(hi), int2Nibble(lo)}; out = new String(nibbleBytes); return out; } // Only positive ints though. BigEndian public static byte[] uint2bytes(int in) { byte out[] = new byte[4]; if (in < 0) { in = 0 - in;// Don't put up with sign bits; } out[3] = int2ubyte(in & 0xff); in >>= 8; out[2] = int2ubyte(in & 0xff); in >>= 8; out[1] = int2ubyte(in & 0xff); in >>= 8; out[0] = int2ubyte(in & 0xff); return out; } public static String bytes2hex(byte[] bytes) { StringBuilder sb = new StringBuilder(); int i; int lo; int hi; for (i = 0; i < bytes.length; i++) { sb.append(byte2hex(bytes[i])); } return sb.toString(); } }