Я не знаю, сколько раз я сталкивался с этим. Итак, я написал этот класс, который может многое делать с помощью Hex-манипуляций. Переход от байтового массива к шестнадцатеричному, ascii ... только hi или low nib ...
<code>/**
* Utility class for hexadecimal conversions.
*
* @author john.matthews
*
*/
public class Hex {
/** Array of bytes with the Hex values representing ASCII characters '0' thru '9' and 'A' thru 'F' */
private static byte HEX_BYTE_MAP[] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46};
/** Array of chars with the values '0' thru '9' and 'A' thru 'F' */
private static char HEX_CHAR_MAP[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
/**
* Returns a string representation of the specified range of bytes in a byte array.
* The hexadecimal value of each byte is converted to its ASCII representation and
* followed by a space. <pre>For example: x'327F' ==> "32 7F "
*
* @param b - байтовый массив, содержащий байты для преобразования
* @param offset - начальная позиция в массиве (0 - крайняя левая позиция)
* @param n - длина или количество байтов для преобразования
* @return строка, представляющая указанные байты
* /
public static String toHex (byte b [], int offset, int n) {
int end = Math.min (смещение + n, длина b);
StringBuffer buffer = new StringBuffer ();
for (int i = offset; i For example: x'327F' ==> "32 7F "
*
* @param b - байтовый массив для преобразования
* @return строка, представляющая байты в массиве
* /
public static String toHex (byte b []) {
если (б == NULL)
return "(null)";
вернуться к Hex (b, 0, b.length);
}
/ **
* Возвращает строковое представление байта, переданного этому методу.
* шестнадцатеричное значение байта преобразуется в его представление ASCII.
*
For example: x'7F' ==> "7F"
*
* @param b - байт для преобразования
* @ возвращаемое строковое представление байта
* /
public static String toHex (byte b) {
// Создаем массив символов, соответствующих левым и правым шестнадцатеричным цифрам (полубайты)
char [] array = {HEX_CHAR_MAP [(b >> 4) & 0x0f], HEX_CHAR_MAP [b & 0x0f]};
вернуть новую строку (массив);
}
/ **
* Возвращает строковое представление символа, переданного этому методу.
* ASCII-значение символа преобразуется в его шестнадцатеричное представление
* и имеет префикс с двумя нулями.
*
For example: "N" ==> "004E"
*
* @param c - символ для преобразования
* @ возвращаемое строковое представление персонажа
* /
public static String toHex (char c) {
// сдвиг вправо на 8 бит для байта hi приводит к 0!
байт hi = (байт) (c >>> 8);
// Байт lo содержит шестнадцатеричное значение для символа
байт lo = (байт) (c & 0xff);
вернуться к Hex (привет) + toHex (ло);
}
/ **
* Возвращает строковое представление указанного диапазона байтов в байтовом массиве.
* Шестнадцатеричное значение каждого байта используется для поиска соответствующего ASCII
* символ для отображения. Любые нули (значение x'00 ') удаляются.
*
For example: x'31006A' ==> "1j"
*
* @param b - байтовый массив, содержащий байты для преобразования
* @param start - начальная позиция в массиве (0 - крайняя левая позиция)
* @param length - количество байтов для преобразования
* @return строка, представляющая указанные байты
* /
public static String toASCII (byte b [], int start, int length) {
StringBuffer asciiString = new StringBuffer ();
for (int i = start; i <(length + start); i ++) {
// исключаем нули из представления ASCII
if (b [i]! = (byte) 0x00) {
asciiString.append ((символ) б [I]);
}
}
return asciiString.toString ();
}
/ **
* Возвращает байтовый массив с шестнадцатеричными значениями указанного представления ASCII
* строка Начальные символы "0x" в строке не конвертируются. Строки нечетного размера
* будет дополнен нулем для самого левого полубайта.
* <pre>For example: "0xF310D6A" ==> x'0F310D6A'
*
* @param str - строка для преобразования
* @ возврат байтового массива с шестнадцатеричными значениями
* /
public static byte [] toBytes (String str) {
StringBuffer convString;
// Удалить шестнадцатеричный префикс "0x", если существует
if (str.length ()> 1 && str.toLowerCase (). startWith ("0x")) {convString = новый StringBuffer (str.substring (2));
}
еще {
convString = новый StringBuffer (str);
}
// Для строк нечетного размера, отступ слева от 0
if (convString.length ()% 2 == 1) {
convString.insert (0, '0');
}
byte [] result = new byte [convString.length () / 2];
for (int i = 0; i For Example: hi="F" lo="8" ==> x'F8'
*
* @param hi - высокий клев или левая шестнадцатеричная цифра в формате ASCII
* @param lo - маленькая шестигранная или правая шестнадцатеричная цифра в формате ASCII
* @ вернуть байт в шестнадцатеричном формате
* /
открытый статический байт из ASCII (байт привет, байт lo) {
return (байт) Integer.parseInt (новая строка (новый байт [] {привет, lo}), 16);
}
/ **
* Возвращает десятичное значение указанного диапазона представленного ASCII
* шестнадцатеричный клев.
*
For Example: x'007D' ==> "125"
*
* @param asciiRepArray - массив, содержащий байты ASCII для преобразования
* @param startPos - начальная позиция в массиве (0 - крайняя левая позиция)
* @param length - количество байтов для преобразования
* @ возвращаемое строковое представление десятичного значения
* /
public static String fromASCII (byte [] asciiArray, int startPos, int length) {
int value = Integer.parseInt (Bytes.subsetAsString (asciiArray, startPos, length), 16);
возврат "" + значение;
}
/ **
* Возвращает десятичное значение указанного диапазона представленного ASCII
* шестнадцатеричный клев. Возвращенная строка будет дополнена ведущими
* нули для указанного количества цифр.
*
For Example: x'007D', 4 digits ==> "0125"
*
* @param asciiRepArray - массив, содержащий байты ASCII для преобразования
* @param startPos - начальная позиция в массиве (0 - крайняя левая позиция)
* @param length - количество байтов для преобразования
* @param digits - количество цифр, которое должен иметь результат
* @ возвращаемое строковое представление десятичного значения
* /
public static String fromASCII (byte [] asciiArray, int startPos, int length, int digits) {
String prePaddedValue = fromASCII (asciiArray, startPos, length);
String padding = new String ();
for (int i = prePaddedValue.length (); i <цифры; i ++) {
padding + = "0";
}
возврат заполнения + prePaddedValue;
}
/ **
* Преобразует верхний полубайт шестнадцатеричного значения в байт представления ASCII.
* <pre>For Example: x'F8' ==> "F"
*
* @param hexByte - байт с желаемым шестнадцатеричным значением
* @ возвращает байт в формате ASCII, представляющий левую шестнадцатеричную цифру
* /
открытый статический байт nibHiToASCII (byte hexByte) {
return HEX_BYTE_MAP [(hexByte & 0xF0) >> 4];
}
/ **
* Преобразует младший полубайт шестнадцатеричного значения в байт представления ASCII.
*
For Example: x'F8' ==> "8"
*
* @param hexByte - байт с желаемым шестнадцатеричным значением
* @ возвращает байт в формате ASCII, представляющий правильную шестнадцатеричную цифру
* /
открытый статический байт nibLoToASCII (byte hexByte) {
return HEX_BYTE_MAP [hexByte & 0x0F];
}
}