Как преобразовать шестнадцатеричные строки в байтовые значения в Java - PullRequest
22 голосов
/ 28 декабря 2011

У меня есть массив строк. Я хочу преобразовать его в байтовый массив. Я использую программу Java. Например:

String str[] = {"aa", "55"};

преобразовать в:

byte new[] = {(byte)0xaa, (byte)0x55};

Что я могу сделать?

Ответы [ 10 ]

54 голосов
/ 28 декабря 2011
String str = "Your string";

byte[] array = str.getBytes();
15 голосов
/ 28 декабря 2011

Глядя на пример, я предполагаю, что вы имеете в виду, что массив строк на самом деле является массивом HEX-представления байтов, не так ли?

Если да, то для каждого элемента строки я бы сделал следующее:

  1. проверка того, что строка состоит только из 2 символов
  2. эти символы находятся в интервале '0' .. '9' или 'a' .. 'f' (возьмите их случайтакже учитывается)
  3. преобразует каждый символ в соответствующее число, вычитая значение кода '0' или 'a'
  4. , строит значение байта, где первый символ - старшие битыи второй символ ниже.Например,

    int byteVal = (firstCharNumber << 4) | secondCharNumber;
    
11 голосов
/ 28 декабря 2011

Преобразовать строку в массив байтов:

byte[] theByteArray = stringToConvert.getBytes();

Преобразовать строку в байт:

 String str = "aa";

 byte b = Byte.valueOf(str);
9 голосов
/ 28 декабря 2011

Вы можете попробовать что-то похожее на это:

String s = "65";

byte value = Byte.valueOf(s);

Используйте метод Byte.ValueOf() для всех элементов массива String, чтобы преобразовать их в байтовые значения.

3 голосов
/ 01 сентября 2015

Поскольку не было ответа для шестнадцатеричной строки в однобайтовое преобразование , вот мое:

private static byte hexStringToByte(String data) {
    return (byte) ((Character.digit(data.charAt(0), 16) << 4)
                  | Character.digit(data.charAt(1), 16));
}

Пример использования:

hexStringToByte("aa"); // 170
hexStringToByte("ff"); // 255
hexStringToByte("10"); // 16

Или вы также можете попробовать Integer.parseInt(String number, int radix) IMO, это намного лучше, чем другие.

// first parameter is a number represented in string
// second is the radix or the base number system to be use
Integer.parseInt("de", 16); // 222
Integer.parseInt("ad", 16); // 173
Integer.parseInt("c9", 16); // 201
3 голосов
/ 28 декабря 2011

Долгий путь :). Мне не известны способы избавления от длинных for заявлений

ArrayList<Byte> bList = new ArrayList<Byte>();
for(String ss : str) {
    byte[] bArr = ss.getBytes();
    for(Byte b : bArr) {
        bList.add(b);
    }
}
//if you still need an array
byte[] bArr = new byte[bList.size()];
for(int i=0; i<bList.size(); i++) {
    bArr[i] = bList.get(i);
}
2 голосов
/ 28 декабря 2011
String source = "testString";
byte[] byteArray = source.getBytes(encoding); 

Вы можете использовать foreach и делать то же самое со всеми строками в массиве.

0 голосов
/ 26 июля 2018

Здесь, если вы конвертируете строку в байт []. Существует служебный код:

    String[] str = result.replaceAll("\\[", "").replaceAll("\\]","").split(", ");
    byte[] dataCopy = new byte[str.length] ;
    int i=0;
    for(String s:str ) {
        dataCopy[i]=Byte.valueOf(s);
        i++;
    }
    return dataCopy;
0 голосов
/ 01 июля 2017
String str[] = {"aa", "55"};

byte b[] = new byte[str.length];

for (int i = 0; i < str.length; i++) {
    b[i] = (byte) Integer.parseInt(str[i], 16);
}

Integer.parseInt (string, radix) преобразует строку в целое число, параметр radix определяет систему счисления.

Используйте основание 16, если строка представляет шестнадцатеричное число.
Используйте основание 2, если строка представляет двоичное число.
Используйте основание 10 (или опустите параметр радиуса), если строка представляет собой десятичное число.

Для получения дополнительной информации см. Документацию по Java: https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String,%20int)

0 голосов
/ 20 июня 2015

Самый простой способ (с использованием Apache Common Codec):

byte[] bytes = Hex.decodeHex(str.toCharArray());
...