2016-05-16 2 views
4

я могу это сделать в JavaЕсть ли компактный способ кодирования двоичных литералов в Java?

final byte[] b = new byte[]{0x01, 0x02, 0x04, 0x08, 
          (byte)0x80, 0x40, 0x20, (byte)0xff, 
          (byte)0xef, 0x40, 0x30, (byte)0xfe, 
          0x3f, (byte)0x90, 0x44, 0x78}; 

в то время как в Python 2.x я могу просто использовать

b = '\x01\x02\x04\x08\x80\x40\x20\xff\xef\x40\x30\xfe\x3f\x90\x44\x78' 

Синтаксис Java боль и нуждается в (byte) проливает обрабатывать значения с самым значительным битом ,

Есть ли более простой способ? (кроме написания вспомогательного класса, чтобы включить строку, такую ​​как "01020408804020ffef4030fe3f904478", в byte[])

+0

Вы можете использовать 'BigInteger', чтобы избежать необходимости писать класс-помощник самостоятельно. – resueman

+1

* «В стороне от написания вспомогательного класса ...» * Я подозреваю, что нет. –

+1

@malbarbo - Не дубликат этого вопроса, который просто хочет знать, как исправить проблему, вызванную отсутствием приведения. Я * знаю *, что метод по умолчанию для создания литерала массива байтов в Java требует отбрасываний, я хочу знать, есть ли способ выразить байтовые массивы более компактно. –

ответ

3

Выберите свой яд. Все альтернативы так или иначе болезненны.
It is lamentable that Java's byte type is signed instead of unsigned.

  1. Шестнадцатеричные байт-константы с литьем. Для равномерности вы должны просто бросать каждый элемент. Это нормально для очень коротких списков.

    byte[] b = {(byte)0x00, (byte)0x7F, (byte)0x80, (byte)0xFF}; 
    
  2. Подпись десятичных байт-констант, чтобы избежать кастинга. Очень немногие инструменты могут легко читать или писать этот формат. Наверное, это не полезно на практике.

    byte[] b = {0, 127, -128, -1}; 
    
  3. Преобразование между байтами через вспомогательную функцию. Он выглядит аккуратно и аккуратно, и он полезен для средних объемов данных.

    byte[] b = toBytes(new int[]{0x00, 0x7F, 0x80, 0xFF}); 
    
    static byte[] toBytes(int[] x) { 
        byte[] y = new byte[x.length]; 
        for (int i = 0; i < x.length; i++) 
         y[i] = (byte)x[i]; 
        return y; 
    } 
    
  4. Преобразование строк в байт. Теперь вы можете использовать только 2 символа на байт (без запятых или 0x), плюс постоянное количество накладных расходов.

    byte[] b = hexToBytes("007F80FF"); 
    
    static byte[] hexToBytes(String s) { 
        byte[] b = new byte[s.length()/2]; 
        for (int i = 0; i < b.length; i++) 
         b[i] = (byte)Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16); 
        return b; 
    } 
    
  5. Base64-encoded string. Это еще более компактно, чем # 4, но требует работы для кодирования. Декодирование выполняется с использованием java.util.Base64 (Java SE 8+). У меня есть один фактический пример, где я stored a Base64 binary blob in my Java source code.

Смежные вопросы