/* * RomRaider Open-Source Tuning, Logging and Reflashing * Copyright (C) 2006-2014 RomRaider.com * * This program 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 of the License, or * (at your option) any later version. * * This program 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; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package com.romraider.util; public final class HexUtil { private HexUtil() { } public static String asHex(byte b) { return asHex(new byte[]{b}); } public static String asHex(byte[] in) { return bytesToHex(in).toUpperCase(); } public static byte[] asBytes(String hex) { if (null == hex) return new byte[0]; if (hex.indexOf(' ') >= 0) { hex = hex.replaceAll(" ", ""); } if (hex.toLowerCase().indexOf("0x") >= 0) { hex = hex.replaceAll("(?i)0x", ""); } return hexToBytes(hex); } public static String bytesToHex(byte[] bs, int off, int length) { StringBuffer sb = new StringBuffer(length * 2); bytesToHexAppend(bs, off, length, sb); return sb.toString(); } public static void bytesToHexAppend(byte[] bs, int off, int length, StringBuffer sb) { sb.ensureCapacity(sb.length() + length * 2); for (int i = off; (i < (off + length)) && (i < bs.length); i++) { sb.append(Character.forDigit((bs[i] >>> 4) & 0xf, 16)); sb.append(Character.forDigit(bs[i] & 0xf, 16)); } } public static String bytesToHex(byte[] bs) { return bytesToHex(bs, 0, bs.length); } public static byte[] hexToBytes(String s) { return hexToBytes(s, 0); } public static byte[] hexToBytes(String s, int off) { byte[] bs = new byte[off + (1 + s.length()) / 2]; hexToBytes(s, bs, off); return bs; } public static void hexToBytes(String s, byte[] out, int off) throws NumberFormatException, IndexOutOfBoundsException { int slen = s.length(); if ((slen % 2) != 0) { s = '0' + s; } if (out.length < off + slen / 2) { throw new IndexOutOfBoundsException("Output buffer too small for input (" + out.length + "<" + off + slen / 2 + ")"); } // Safe to assume the string is even length byte b1, b2; for (int i = 0; i < slen; i += 2) { b1 = (byte) Character.digit(s.charAt(i), 16); b2 = (byte) Character.digit(s.charAt(i + 1), 16); if ((b1 < 0) || (b2 < 0)) { throw new NumberFormatException(); } out[off + i / 2] = (byte) (b1 << 4 | b2); } } public static int hexToInt(String input) { if (input.length() > 2 && input.substring(0, 2).equalsIgnoreCase("0x")) { return Integer.parseInt(input.substring(2), 16); } else { return Integer.parseInt(input, 16); } } public static String intToHexString(int input) { return "0x" + Integer.toHexString(input).toUpperCase(); } }