Преобразование набора строк в массив byte [] - PullRequest
2 голосов
/ 13 января 2010

Я пытаюсь преобразовать набор строк в массив byte []. Сначала я делаю что-то вроде этого, чтобы преобразовать байтовый массив в строку:

public String convertByte(byte[] msg) {
    String str = "";        
    for(int i = 0; i < msg.length; i++) {
        str += (msg[i] + " * ");
    }       
    return str;
}

Когда я пытаюсь преобразовать обратно в массив byte [], я не получаю те же значения, что и при преобразовании в строку. У меня изначально было что-то, что дало мне неправильные значения.

Я сейчас пробую что-то вроде:

public static byte[] convertStr(String ln)
{
    System.out.println(ln);

    String[] st = ln.split(" * ");
    byte[] byteArray = new byte[23];
    for(int i = 0; i < st.length; i++)
    {
        byteArray[i] = st[i].get byte value or something;
    }

    return byteArray;
}

Если я пытаюсь использовать метод getbytes () из API-интерфейса String, он возвращает массив байтов, а не байт, и это моя проблема.

Любая помощь будет высоко ценится.

Ответы [ 6 ]

2 голосов
/ 13 января 2010

Использование Byte.parseByte может помочь заставить ваш второй фрагмент работать.

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

public static byte[] convertStr(String ln)
{
    System.out.println(ln);

    String[] st = ln.split(" * ");
    byte[] byteArray = new byte[23];
    for(int i = 0; i < st.length; i++)
    {
        byteArray[i] = Byte.parseByte(st[i]);
    }

    return byteArray;
}
2 голосов
/ 13 января 2010

Это должно работать:

byte[] bytes = "Hello World".getBytes("UTF-8");
String hello = new String(bytes, "UTF-8");

Приведенный выше пример использует кодировку UTF-8 и служит только примером. Используйте кодировку, которую вы ожидаете при вводе сообщения. (Этот «ответ» не был ответом на вопрос ...)

Редактировать

Итак, нам нужно преобразование из байта [] в строку и обратно в байт []. me123 добавил разделители между (и перед) значениями. Как уже объяснили другие, 1. регулярное выражение для разделения должно быть " \\* " и 2. магический метод Byte.parseByte(st[i])

Вот альтернатива без использования разделителя, но фиксирует ширину для байтовых записей. Конвертер StringToByte показывает довольно быстрое решение, основанное только на массиве строк.

public static String convertByte(byte[] msg) {
    StringBuilder sb = new StringBuilder();
    for (byte b:msg) {
        sb.append(String.format("%02x", b));
    }
    return sb.toString();
}

public static byte[] convertStr(String ln)
{
    System.out.println(ln);
    char[] chars = ln.toCharArray();
    byte[] result = new byte[ln.length()/2];
    for (int i = 0;i < result.length; i++) {
        result[i] = (byte) hexToInt(chars[2*i], chars[2*i+1]);
    }

    return result;
}

private static int hexToInt(char c1, char c2) { 
    return ((c1 <= '9' ? c1 - '0':c1 - 'a'+10) << 4) 
           + (c2 <= '9' ? c2 - '0':c2 - 'a'+10);
}
0 голосов
/ 02 января 2013

hexToInt должен быть таким

private static int hexToInt(char c1, char c2) {
    return (Character.digit(c1, 16) << 4) + Character.digit(c2, 16);
}

В противном случае CA возвращает AA в байтах.

0 голосов
/ 13 января 2010

Если вы уверены, что строка содержит 1 байт, вы можете сделать:

byteArray[i] = st[i].getbytes()[0];
0 голосов
/ 13 января 2010

Если вы уверены, что строка будет достаточно маленькой, чтобы поместиться в один байт, вы можете сделать

st[i].getBytes()[0];

однако в большинстве случаев ваша строка, вероятно, будет больше, поэтому в этих случаях это невозможно ...

0 голосов
/ 13 января 2010

Я не понимаю, почему вы пытаетесь получить эти байты по символам. getBytes () и его варианты предоставят вам массив byte [] для всей строки сразу. Однако, если вы хотите увидеть, как кодируются символы, ваш подход может быть хорошим, но вы должны помнить, что один символ может быть закодирован, например, в. от одного до четырех байтов в некоторых кодировках, поэтому вам необходим байтовый массив для каждого символа.

...