Преобразование строки в шестнадцатеричное значение, которое она представляет - PullRequest
2 голосов
/ 15 декабря 2011

это сводит меня с ума, потому что я знаю, что есть простое решение, но я не могу его найти ...

У меня есть поле edittext, которое запрашивает шестнадцатеричное число, текстовое поле ограничено только получением 0-9, а, б, в, д, е, е.

Как мне преобразовать эту строку в фактическое число?

Пример: String = 0F => int = 0F или, возможно, => 0000 1111.

Я пытаюсь сохранить MAC-адреса и затем манипулирую ими, и я знаю только, как хранить строкив SQLite!:)

Ответы [ 3 ]

4 голосов
/ 15 декабря 2011

Integer.parseInt(String s, int radix) - это то, что вы хотите.Передайте 16 как основание. Прочитайте документы здесь .

Для MAC-адресов вы можете обнаружить, что Integer недостаточно большой тип, поэтому вместо него попробуйте эквивалент Long.

И если даже Long недостаточно велик или вы хотите сколь угодно большой точности, используйте вместо этого BigInteger.Вы можете передать основание конструктору: public BigInteger(String val, int radix).

И для еще большей гибкости посмотрите на IntegerValidator, предоставляемый Apache Commons .

0 голосов
/ 19 марта 2013

Для четной строки

public static byte[] hexStringToByteArray(String str) {
try {


    String s = str;
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        if (i == len - 1) {
             System.out.println("in correct");                   
        } else {

            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                    + Character.digit(s.charAt(i + 1), 16));


        }
    }
    return data;
} catch (StringIndexOutOfBoundsException sex) {

    writeDirtyData(str.substring(0, str.indexOf(",")));
}
return null;

}

Нечетная шестнадцатеричная строка верна . Проверьте источник, вы получите эту строку. Это из-за усечения строки из-за ограничения количества символов. Если String - изображение, хранящееся в базе данных, получить его с помощью программы, не используя никаких инструментов

У меня была такая же проблема с .net и MSSQL, и с помощью веб-сервиса и Java-клиента я перепробовал все преобразования и библиотеки, включая axis и util jpg

0 голосов
/ 16 декабря 2011

Я не знаю, сколько раз я сталкивался с этим. Итак, я написал этот класс, который может многое делать с помощью 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]; } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...