Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Java (https://forum.zone-game.info/forumdisplay.php?f=126)
-   -   Java CharsetDecoder Exception (https://forum.zone-game.info/showthread.php?t=29474)

asura013 13.06.2013 18:43

Java CharsetDecoder Exception
 
внезапно пришлось работать с байтовыми потоками и т.п. на джаве и тут понеслось...
в данном случае мне нужно представить ByteBuffer в виде строки, в качестве дебага заполняю буфер массивом байт, полученного из хекс строки о_О
Код:

        byte[] bytedata = hexStringToByteArray(hexdata);
        ByteBuffer bindata = ByteBuffer.allocate(16384);
        bindata.put(bytedata);
        bindata.flip();
        bindata.order(ByteOrder.LITTLE_ENDIAN);
        System.out.println(bb_to_str(bindata));

преобразование байтбуфера в стринг спёрто из гугла
Код:

public static String bb_to_str(ByteBuffer buffer){
        Charset charset = Charset.forName("UTF-8");
        CharsetDecoder decoder = charset.newDecoder();
        String data = "";
        try{
                int old_position = buffer.position();
                data = decoder.decode(buffer).toString();
                buffer.position(old_position); 
        }catch (Exception e){
                e.printStackTrace();
                return "";
        }
        return data;
}

так вот
строка
Код:

String hexdata = "3b2e000000071d535441543a4465616c65645461736b3d313a313a313a3231303a3231300373707a0767616d656462643b280000000717535441543a506f6c6c3d313a313a313a3136323a3136320373707a0767616d656462643b2b000000071a535441543a50726f746f636f6c733d383a313a313a34303a34370373707a0767616d656462643b30000000071f535441543a5461736b517565756553697a653d323a303a303a3231303a31370373707a0767616d65646264";
без проблем проходит ччерез декодер, но строка
Код:

String hexdata = "3e2e000000061f474d3ab7fecef1c6f7315b7461673a315dbdbbd2d7bfaab9d8ceaa284f6e290373707a0567616d65643e2e000000061f474d3ab7fecef1c6f7315b7461673a315dc5c4c2f4bfaab9d8ceaa284f6e290373707a0567616d65643e2e000000061f474d3ab7fecef1c6f7315b7461673a315dd3cabcfebfaab9d8ceaa284f6e290373707a0567616d65643e2e000000061f474d3ab7fecef1c6f7315b7461673a315db0efc5c9bfaab9d8ceaa284f6e290373707a0567616d6564";
падает с ошибкой

Код:

java.nio.charset.MalformedInputException: Input length = 1
        at java.nio.charset.CoderResult.throwException(Unknown Source)
        at java.nio.charset.CharsetDecoder.decode(Unknown Source)

хотя в буфере лимит 186 >_> вопрос - чем декодеру не нравится вторая строка?

VISTALL 13.06.2013 22:09

Re: Java CharsetDecoder Exception
 
Понимаете - декодер чтото ожидает. Знач не полные байты. Знакомое. Оно и не читалось

asura013 14.06.2013 08:17

Re: Java CharsetDecoder Exception
 
фишка в том, что на пхп я этот хекс разбираю без проблем >_>
структура второй строки аналогична структуре первой - длина строки, строка, длина и т.п. брал хекс из tcpdump.
может есть другие способы байтбуфер в строку перегнать?

acmi 14.06.2013 09:38

Re: Java CharsetDecoder Exception
 
Код:

byte[] bytedata = new BigInteger(hexdata, 16).toByteArray();
ByteBuffer bindata = ByteBuffer.wrap(bytedata);
System.out.println(new String(bindata.array(), 0, bindata.limit(), Charset.forName("UTF-8")));


asura013 14.06.2013 16:16

Re: Java CharsetDecoder Exception
 
да, так ошибок не вылетает =) благодарю


Текущее время: 14:21. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot