преобразование шестнадцатеричной строки в байтовый массив - PullRequest
2 голосов
/ 08 марта 2020

Я написал программу, которая преобразует шестнадцатеричную строку в байтовый массив, например, "2e65" производит [2,14,6,5].

Есть ли способ сделать это с меньшим количеством строк кода или без использования таблицы ASCII значения.

public static byte[] stringToData( String dataString) {
    byte [] hexStringToByteArr = new byte[dataString.length()];
    for ( int i = 0; i < dataString.length(); i++) {
        char c = dataString.charAt(i);
        if ( c == 48 ) { hexStringToByteArr[i] = 0;}
        if ( c == 49 ) { hexStringToByteArr[i] = 1;}
        if ( c == 50 ) { hexStringToByteArr[i] = 2;}
        if ( c == 51 ) { hexStringToByteArr[i] = 3;}
        if ( c == 52 ) { hexStringToByteArr[i] = 4;}
        if ( c == 53 ) { hexStringToByteArr[i] = 5;}
        if ( c == 54 ) { hexStringToByteArr[i] = 6;}
        if ( c == 55 ) { hexStringToByteArr[i] = 7;}
        if ( c == 56 ) { hexStringToByteArr[i] = 8;}
        if ( c == 57 ) { hexStringToByteArr[i] = 9;}
        if ( c == 97 ) { hexStringToByteArr[i] = 10;}
        if ( c == 98 ) { hexStringToByteArr[i] = 11;}
        if ( c == 99 ) { hexStringToByteArr[i] = 12;}
        if ( c == 100 ) {hexStringToByteArr[i] = 13;}
        if ( c == 101 ) {hexStringToByteArr[i] = 14;}
        if ( c == 102 ) {hexStringToByteArr[i] = 15;}
    }
    return hexStringToByteArr;
}

public static void main(String [] args) {
    String pracString = "2e65";    
    System.out.println(Arrays.toString(stringToData(pracString)));
}

Ответы [ 3 ]

2 голосов
/ 08 марта 2020

"2e65" в шестнадцатеричном формате представляет два байта (2e, что соответствует 46 в десятичном формате, и 65, что соответствует 101 в десятичном виде). Чтобы получить byte[], содержащий два байта, вы можете использовать BigInteger:

String hex = "2e65";
byte[] b = new BigInteger(hex, 16).toByteArray();
System.out.println(Arrays.toString(b));

Вывод приведенного выше фрагмента:

[46, 101]

Если вместо этого, Вы хотите преобразовать каждую из четырех шестнадцатеричных цифр в byte и сохранить их в byte[], затем вы можете использовать Character#digit, перебирая каждую char в String:

String hex = "2e65";
byte[] b = new byte[hex.length()];

for (int i = 0; i < b.length; i++) {
    b[i] = (byte) Character.digit(hex.charAt(i), 16);
}

System.out.println(Arrays.toString(b));

Вывод приведенного выше фрагмента:

[2, 14, 6, 5]
0 голосов
/ 08 марта 2020

Ваш большой блок можно заменить на:

hexStringToByteArr[i] = c < 58 ? c - 48 : c - 87;
0 голосов
/ 08 марта 2020

Чтобы преобразовать шестнадцатеричную строку в байтовый массив, вам нужно сначала получить длину заданной строки и включить ее при создании нового байтового массива.

string str = "2e65";
byte[] val = new byte[str.length() / 2];

Теперь возьмем a для l oop до длины байтового массива.

for (int i = 0; i < val.length; i++) {
   int index = i * 2;
   int j = Integer.parseInt(str.substring(index, index + 2), 16);
   val[i] = (byte) j;
}

Итак, поскольку байтовые массивы должны быть вдвое меньше, измените эту строку

byte[] hexStringToByteArr = new byte[dataString.length()];

на эту:

byte[] hexStringToByteArr = new byte[dataString.length() / 2];
...