Как преобразовать байтовый массив в шестнадцатеричную строку в Java?

Если вы действительно хотите геометрию, вы можете использовать QDesktopWidget , чтобы получить информацию о дисплее, включая геометрию.

Если вы просто хотите, чтобы окно но вы должны использовать QWidget::setWindowState , поскольку предложил Andrew .

583
задан Ciro Santilli 新疆改造中心996ICU六四事件 2 May 2015 в 19:55
поделиться

1 ответ

Вот некоторые общие опции, заказанные от простого (острота) к комплексу (огромная библиотека).

Опция 1: Фрагмент кода - Простой

Одно очень простое решение должен использовать BigInteger шестнадцатеричное представление:

new BigInteger(1, someByteArray).toString(16)

Примечание, что, так как это обрабатывает числа не произвольный строки байтов , это опустит начальные нули - это может или не может быть тем, что Вы хотите (например, 000AE3 по сравнению с 0AE3). Это также очень медленно, приблизительно [1 123] 50x медленнее по сравнению со следующей опцией.

Опция 2: Фрагмент кода - Усовершенствованный

Вот является полнофункциональным фрагментом кода, поддерживающим верхний/строчный и порядок байтов . Это оптимизировано, чтобы минимизировать сложность памяти и максимизировать производительность и должно быть совместимо со всеми современными версиями Java (5 +).

private static final char[] LOOKUP_TABLE_LOWER = new char[]{0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66};
private static final char[] LOOKUP_TABLE_UPPER = new char[]{0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46};

public static String encode(byte[] byteArray, boolean upperCase, ByteOrder byteOrder) {

    // our output size will be exactly 2x byte-array length
    final char[] buffer = new char[byteArray.length * 2];

    // choose lower or uppercase lookup table
    final char[] lookup = upperCase ? LOOKUP_TABLE_UPPER : LOOKUP_TABLE_LOWER;

    int index;
    for (int i = 0; i < byteArray.length; i++) {
        // for little endian we count from last to first
        index = (byteOrder == ByteOrder.BIG_ENDIAN) ? i : byteArray.length - i - 1;

        // extract the upper 4 bit and look up char (0-A)
        buffer[i << 1] = lookup[(byteArray[index] >> 4) & 0xF];
        // extract the lower 4 bit and look up char (0-A)
        buffer[(i << 1) + 1] = lookup[(byteArray[index] & 0xF)];
    }
    return new String(buffer);
}

public static String encode(byte[] byteArray) {
    return encode(byteArray, false, ByteOrder.BIG_ENDIAN);
}

Это по существу использует код в опции 3. Если Вы хотите видеть некоторых , микро сравнительный тест JMH , сравнивая несколько реализаций, видит здесь . Полный исходный код с лицензией Apache v2 и декодером может быть найден здесь .

Опция 3: Пользование небольшой оптимизированной библиотекой: Java байтов

При работе над моим предыдущим проектом, я создал этот небольшой инструментарий для работы с байтами в Java. Это не имеет никаких внешних зависимостей и совместимо с Java 7 +. Это включает, среди других, очень быстрого и хорошо протестированного ШЕСТНАДЦАТЕРИЧНОГО en/decoder:

import at.favre.lib.bytes.Bytes;
...
Bytes.wrap(someByteArray).encodeHex()

можно проверить его на [1 114] GitHub: Java байтов .

Опция 4: Apache Кодек палаты общин

, Конечно, существует польза 'ol кодеки свободного городского населения . ( мнение о предупреждении вперед ) При работе над проектом, обрисованным в общих чертах выше, я проанализировал код и был вполне разочарован; много дубликата неорганизованный код, устаревшие и экзотические кодеки, вероятно, только полезные для очень немногих и вполне по спроектированным и медленным реализациям популярных кодеков (конкретно Base64). Я поэтому сделал бы обоснованное решение, если Вы хотите использовать его или альтернатива. Так или иначе, если Вы все еще хотите использовать его, вот фрагмент кода:

import org.apache.commons.codec.binary.Hex;
...
Hex.encodeHexString(someByteArray));

Опция 5: Гуава Google

, Как правило, Вы уже имеете Гуава как зависимость. Раз так просто используйте:

import com.google.common.io.BaseEncoding;
...
BaseEncoding.base16().lowerCase().encode(someByteArray);

Опция 6: безопасность Spring

, Если Вы используете платформа Spring с [1 118] безопасность Spring , можно использовать следующее:

import org.springframework.security.crypto.codec.Hex
...
Hex.encode(someByteArray);
<час>

совместимость Java 9 или 'Не Использует JAXBs javax/xml/bind/DatatypeConverter'

В предыдущем Java (8, и ниже) присваивает версию коду Java для JAXB, был включен как зависимость во время выполнения. Начиная с Java 9 и модуляризация Мозаики Ваш код не может получить доступ к другому коду за пределами, он - модуль. Так знайте, если Вы получаете исключение как:

java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

при работе JVM с Java 9 +. Раз так тогда переключите реализации на любую из альтернатив выше. См. также этот вопрос .

5
ответ дан patrickf 4 November 2019 в 07:38
поделиться
  • 1
    @Sime - Я сделал acknoledge что: " Так или иначе первая строка имела одинарные кавычки, когда я скопировал ее с вопроса об операции в секунду. Исправленный теперь так или иначе " – djdd87 4 March 2011 в 15:08
Другие вопросы по тегам:

Похожие вопросы: