- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
private String nextUTF8Character() throws IOException, CharacterCodingException
{
int iCodePoint = 0;
int byte1, byte2, byte3, byte4;
byte1 = is.read();
if (byte1 == -1)
return null;
// проверяем является ли первый бит нулевым
if ((byte1 & 0x80) == 0)
{
// один байт
iCodePoint = byte1 & 0x7F;
return new String(Character.toChars(iCodePoint));
}
byte2 = is.read();
if (byte2 == -1)
return null;
if ((byte1 & 0xE0) == 0xC0 && (byte2 & 0xC0) == 0x80)
{
// два байта
iCodePoint = ((byte1 & 0x1F) << 6) | (byte2 & 0x3F);
if (iCodePoint > 0x7F)
return new String(Character.toChars(iCodePoint));
else
throw new CharacterCodingException();
}
byte3 = is.read();
if (byte3 == -1)
return null;
if ((byte1 & 0xF0) == 0xE0 && (byte2 & 0xC0) == 0x80 && (byte3 & 0xC0) == 0x80)
{
// три байта
iCodePoint = ((byte1 & 0x0F) << 12) | ((byte2 & 0x3F) << 6) | (byte3 & 0x3F);
if (iCodePoint > 0x7FF)
return new String(Character.toChars(iCodePoint));
else
throw new CharacterCodingException();
}
byte4 = is.read();
if (byte4 == -1)
return null;
if ((byte1 & 0xF8) == 0xF0 && (byte2 & 0xC0) == 0x80 &&
(byte3 & 0xC0) == 0x80 && (byte4 & 0xC0) == 0x80)
{
// четыре байта
iCodePoint = ((byte1 & 0x07) << 18) | ((byte2 & 0x3F) << 12) |
((byte3 & 0x3F) << 6) | (byte4 & 0x3F);
if (iCodePoint > 0x0FFFF)
return new String(Character.toChars(iCodePoint));
else
throw new CharacterCodingException();
}
throw new CharacterCodingException();
}
comnimh 20.05.2010 21:41 # +5
Dummy00001 21.05.2010 00:17 # +2
но меня больше порадовал тот факт что оно посимвольно читает из потока - и посимвольно делает "new String(Character.toChars(iCodePoint));"
не верю что в Жабе нет какого штатного конвертора utf-8 <-> ucs2.
comnimh 21.05.2010 00:28 # +3
http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html
Max ID 21.05.2010 11:29 # −1
А вообще у меня было бы так:
vbttemp = new byte[len];
is.read(vbttemp);
Charset cs = Charset.forName("UTF-8");
String s = cs.decode(ByteBuffer.wrap(vbttemp)).toSt ring();
Dummy00001 21.05.2010 13:40 # +4
*без комментариев*
это уже не говно-код - это говно-днк.
Max ID 21.05.2010 14:04 # −2
Может, еще предложишь использовать Base64 ? Или, может, BinaryXML, как в матрешке?
Dummy00001 21.05.2010 14:19 # +3
XML по определению для структурированых данных.
И смысла в XML все пихать нет, если XML перестает быть совместимым со всеми остальным (тот же XSLT к примеру).
Если нужны блобы, сливай их в отдельный файл а в XML только делай на них ссылку. И парсить руками не надо, и лишний раз ничего конвертировать не надо.
N.B. Блин, даже SQL сервера блобы отдельно держать - потому что неструктурированые данные есть evil, даже если и "necessary evil".
Ну или в крайнем случае - да, какой Base64. Или чего угодно что быстро конвертиться и не портит XML.
Max ID 21.05.2010 14:42 # −1
Вся это шняга передаеццо по сети, и мне каждый байт дорог :)
Что уже говорить про конвертации бинари - текст, где на треть увеличивается длина блоба. Конечно, можно использовать алгоритм хаффмана, у меня даже есть где-то его говнокодная реализация :)
turdman 21.05.2010 16:02 # +1
Блобы отделяются от XML, потом все складывается в самопальный контейнер (не имеющий никакого отношения к XML, если хочется универсальности можно покурить rfc2387 для вдохновения), который уже и проходит через сеть.
Max ID 21.05.2010 16:05 # −1
Это и есть самопальный контейнер!
turdman 21.05.2010 17:34 # +2
>> этот говнокод делался для кастомного XML-анализатора
Я к тому что зачем использовать для передачи данных изнасилованный-XML-с-блобами (и плодить говно-анализаторы), когда можно сделать простейший контейнер (который на порядки проще XML) и уже в него вкладывать блобы (как они есть) и настоящий XML.
Max ID 21.05.2010 18:02 # −1
<data bin длина_данных>
пошел_массив_байтов
</data>
Это даже чем-то похоже на bencode
turdman 21.05.2010 18:29 # +1
Это решение - полное говно: оно подразумевает создание собственного варианта XML, причем отличающегося на самом базовом уровне.
И все для задачи, элементарно решаемой оберткой НАД xml'ом
Dummy00001 21.05.2010 16:10 # +3
с таким кодом, с такой производительностью, тебе наверное 32+ ядер/потоков понадобится что бы гигабит эзернет канал забить.
сделай по тупому - сконвертни все в текст - и проверь насколько канал заполнен. мне слабо верится что ты и до половины ширины гигабитного канала доходишь.
Max ID 21.05.2010 18:03 # 0
comnimh 22.05.2010 10:17 # +2
Но вот это "каждый байт дорог", как правило, бывает преувеличено.
guest 21.05.2010 13:09 # +3
Тут не язык нужно менять, а алгоритм нормальный написать, а лучше вообще использовать старые проверенные средства.
Max ID 21.05.2010 11:31 # −1
comnimh 21.05.2010 11:35 # +3
Блин, у тебя НА КАЖДОМ символе выделяется память в куче. + отрабатывает тяжеленный конструктор.
Max ID 21.05.2010 12:07 # −1
if ("<".equals(кодовая_точка))
...
Хотя, возможно, если как-то переконвертить "<" в кодовую точку, например Character.toCodePoint(char high, char low), а потом сравнить...
comnimh 21.05.2010 12:09 # +1
Max ID 21.05.2010 13:06 # −1
Там же дальше у меня в коде идет метод типа charAt(0).
P.S. А шо ты хатев? Ето ш гамнокодъ!
comnimh 22.05.2010 10:13 # +3
Все бинарные данные в xml должны быть в BASE32/64 или чем-нибудь таком.
Тогда ты сможешь пользоваться Charset.
Ну и на сладкое - строить строку в твоем случае надо StringBuilder'ом. А не string new = old + nextUTF8Character();
guest 21.05.2010 19:46 # +4
Говнокод - это как поход к психологу. Если человек рассказал о своём говне, то ему станет легче. Не нужно его за это укорять или искать причину, а то вследующий раз не придёт причастится на говнокод и будет тихо говнякать.
comnimh 22.05.2010 10:14 # +3
Че бы не помочь человеку?
Может говнокода меньше станет :)
Max ID 21.05.2010 18:05 # −1
This is obvious 21.05.2010 18:36 # +1
guest 21.05.2010 19:25 # +1
посмотрим на твой децкий лепет
xXx_totalwar 21.05.2010 19:39 # +1
так что не страшно
guest 21.05.2010 19:54 # +3
guest 21.05.2010 22:02 # −3
guest 21.05.2010 22:05 # −2
Lure Of Chaos 21.05.2010 22:42 # −2
guest 21.05.2010 22:52 # −2
Lure Of Chaos 21.05.2010 22:55 # −3
Novi4oK 24.08.2021 02:09 # 0