Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
К моему БОЛЬШОМУ сожалению, я не мог использовать чарсет (я его только для енкодера использую), т.к. этот говнокод делался для кастомного XML-анализатора, который мог включать бинарные данные. Следовательно, тут надо анализировать посимвольно, чтобы дойти до того места, где начинаюццо бинарные данные. Я и так уже сначала считывал в байтовый буфер (ByteArrayInputStream, кажеццо), так что хотя бы не с потока.
А вообще у меня было бы так:
vbttemp = new byte[len];
is.read(vbttemp);
Charset cs = Charset.forName("UTF-8");
String s = cs.decode(ByteBuffer.wrap(vbttemp)).toSt ring();
Ну, мне действительно нужны блобы.
Вся это шняга передаеццо по сети, и мне каждый байт дорог 🙂
Что уже говорить про конвертации бинари - текст, где на треть увеличивается длина блоба. Конечно, можно использовать алгоритм хаффмана, у меня даже есть где-то его говнокодная реализация 🙂
Какие к чертям собачьим хаффман и кастомные xml парсеры.
Блобы отделяются от XML, потом все складывается в самопальный контейнер (не имеющий никакого отношения к XML, если хочется универсальности можно покурить rfc2387 для вдохновения), который уже и проходит через сеть.
Я к тому что зачем использовать для передачи данных изнасилованный-XML-с-блобами (и плодить говно-анализаторы), когда можно сделать простейший контейнер (который на порядки проще XML) и уже в него вкладывать блобы (как они есть) и настоящий XML.
блин он о байтах заботиться.... еще и хафмана приплетает.
с таким кодом, с такой производительностью, тебе наверное 32+ ядер/потоков понадобится что бы гигабит эзернет канал забить.
сделай по тупому - сконвертни все в текст - и проверь насколько канал заполнен. мне слабо верится что ты и до половины ширины гигабитного канала доходишь.
>блин такое даже в С/С++ будет подтормаживать.
Тут не язык нужно менять, а алгоритм нормальный написать, а лучше вообще использовать старые проверенные средства.
Дак я ж только ЗА обеими руками. Но как его заменить? Можно, конечно, кодовые точки возвращать... А как потом сделать проверку типо:
if ("<".equals(кодовая_точка))
...
Хотя, возможно, если как-то переконвертить "<" в кодовую точку, например Character.toCodePoint(char high, char low), а потом сравнить...
Далее. Откуда у тебя в xml бинарные данные? Какой это тогда вообще xml? %)
Все бинарные данные в xml должны быть в BASE32/64 или чем-нибудь таком.
Тогда ты сможешь пользоваться Charset.
Ну и на сладкое - строить строку в твоем случае надо StringBuilder'ом. А не string new = old + nextUTF8Character();
Чувак, на говнокоде должно лежать говно. Не спрашивай: "Почему автор сговнокодничал?". Ты так говоришь, будто он не исправился и продолжает это говно использовать.
Говнокод - это как поход к психологу. Если человек рассказал о своём говне, то ему станет легче. Не нужно его за это укорять или искать причину, а то вследующий раз не придёт причастится на говнокод и будет тихо говнякать.
но меня больше порадовал тот факт что оно посимвольно читает из потока - и посимвольно делает "new String(Character.toChars(iCodePoint));"
не верю что в Жабе нет какого штатного конвертора utf-8 <-> ucs2.
http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html
А вообще у меня было бы так:
vbttemp = new byte[len];
is.read(vbttemp);
Charset cs = Charset.forName("UTF-8");
String s = cs.decode(ByteBuffer.wrap(vbttemp)).toSt ring();
*без комментариев*
это уже не говно-код - это говно-днк.
Может, еще предложишь использовать Base64 ? Или, может, BinaryXML, как в матрешке?
XML по определению для структурированых данных.
И смысла в XML все пихать нет, если XML перестает быть совместимым со всеми остальным (тот же XSLT к примеру).
Если нужны блобы, сливай их в отдельный файл а в XML только делай на них ссылку. И парсить руками не надо, и лишний раз ничего конвертировать не надо.
N.B. Блин, даже SQL сервера блобы отдельно держать - потому что неструктурированые данные есть evil, даже если и "necessary evil".
Ну или в крайнем случае - да, какой Base64. Или чего угодно что быстро конвертиться и не портит XML.
Вся это шняга передаеццо по сети, и мне каждый байт дорог 🙂
Что уже говорить про конвертации бинари - текст, где на треть увеличивается длина блоба. Конечно, можно использовать алгоритм хаффмана, у меня даже есть где-то его говнокодная реализация 🙂
Блобы отделяются от XML, потом все складывается в самопальный контейнер (не имеющий никакого отношения к XML, если хочется универсальности можно покурить rfc2387 для вдохновения), который уже и проходит через сеть.
Это и есть самопальный контейнер!
>> этот говнокод делался для кастомного XML-анализатора
Я к тому что зачем использовать для передачи данных изнасилованный-XML-с-блобами (и плодить говно-анализаторы), когда можно сделать простейший контейнер (который на порядки проще XML) и уже в него вкладывать блобы (как они есть) и настоящий XML.
<data bin длина_данных>
пошел_массив_байтов
</data>
Это даже чем-то похоже на bencode
Это решение - полное говно: оно подразумевает создание собственного варианта XML, причем отличающегося на самом базовом уровне.
И все для задачи, элементарно решаемой оберткой НАД xml'ом
с таким кодом, с такой производительностью, тебе наверное 32+ ядер/потоков понадобится что бы гигабит эзернет канал забить.
сделай по тупому - сконвертни все в текст - и проверь насколько канал заполнен. мне слабо верится что ты и до половины ширины гигабитного канала доходишь.
Но вот это "каждый байт дорог", как правило, бывает преувеличено.
Тут не язык нужно менять, а алгоритм нормальный написать, а лучше вообще использовать старые проверенные средства.
Блин, у тебя НА КАЖДОМ символе выделяется память в куче. + отрабатывает тяжеленный конструктор.
if ("<".equals(кодовая_точка))
...
Хотя, возможно, если как-то переконвертить "<" в кодовую точку, например Character.toCodePoint(char high, char low), а потом сравнить...
Там же дальше у меня в коде идет метод типа charAt(0).
P.S. А шо ты хатев? Ето ш гамнокодъ!
Все бинарные данные в xml должны быть в BASE32/64 или чем-нибудь таком.
Тогда ты сможешь пользоваться Charset.
Ну и на сладкое - строить строку в твоем случае надо StringBuilder'ом. А не string new = old + nextUTF8Character();
Говнокод - это как поход к психологу. Если человек рассказал о своём говне, то ему станет легче. Не нужно его за это укорять или искать причину, а то вследующий раз не придёт причастится на говнокод и будет тихо говнякать.
Че бы не помочь человеку?
Может говнокода меньше станет 🙂
посмотрим на твой децкий лепет
так что не страшно