Из байта [] в строке в строку? - PullRequest
0 голосов
/ 20 февраля 2012

У меня проблема.

Я отправил некоторые данные через сокет в виде строки. С некоторой подстрокой мне удалось получить byte [] в виде String [B@58596d12. Теперь мой вопрос, это строка. Как мне преобразовать его обратно в байтовый массив, после чего я могу использовать String result = new String(byteArray);?

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

Вот что отправляется:

byte[] all = Files.readAllBytes(f.toPath());
    this.out.println(destinationOfFile + "/" + file.getName() + "*" + all);

И вот что получено:

private void writeToFile(String str) {
        String file = str.substring(0, str.indexOf("*"));
        String write = str.substring(str.indexOf("*")+1);

РЕДАКТИРОВАТЬ: Мне удалось сделать это по-другому. Вместо того, чтобы получать все байты из файла, я не проходил через него строку за строкой, отправляя каждую строку через сокет. В клиенте я сохраняю данные в HashMap, и когда он получает сообщение «Готово отправить файл», он записывает все строки в файл.

Ответы [ 2 ]

3 голосов
/ 20 февраля 2012

Если вы хотите хранить необработанные байты в строке, вам следует использовать кодировку, разработанную для этой цели, например Base64 . Взгляните на библиотеку Commons Codec и Base64 class.

2 голосов
/ 20 февраля 2012

Я использую этот код для преобразования String-Byte [], но я не уверен, поможет ли он вам, потому что я не знаю, есть ли у вас rawBytes в качестве источника или Java-String. Не могли бы вы уточнить?

public static String byteToHexString(byte b) {
    String result = "";
    result += Integer.toHexString((int)(b >> 4) & 0xf);
    result += Integer.toHexString((int)(b) & 0xf);
    return result;
}

public static String bytesToHexString(final byte[] byteArray) {
    if (byteArray == null) {
        return null;
    }
    String result = "";
    for (int i = 0; i < byteArray.length; ++i) {
        result += byteToHexString(byteArray[i]);
    }
    return result;
}

public static byte[] hexStringToBytes(final String hexString) {
    if (hexString == null) {
        return null;
    }
    byte[] result = new byte[hexString.length() / 2];
    for (int idx = 0; idx < result.length; ++idx) {
        int strIdx = idx * 2;
        result[idx] = (byte) ((Character.digit(hexString.charAt(strIdx), 16) << 4)
                + Character.digit(hexString.charAt(strIdx + 1), 16));
    }
    return result;
}

Edit: Если вы конвертируете String-byte [] и byte [] - String, я бы рекомендовал использовать параметр charset или charsetname для String.getBytes () и String-constructor. Например:

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

Помните, что не каждая платформа или jvm могут поддерживать одинаковые кодировки. Для списка кодировок посмотрите здесь .

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

...