- 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
private static String getUTF8String(byte[] b, int off, int len) {
// First, count the number of characters in the sequence
int count = 0;
int max = off + len;
int i = off;
while (i < max) {
int c = b[i++] & 0xff;
switch (c >> 4) {
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
// 0xxxxxxx
count++;
break;
case 12: case 13:
// 110xxxxx 10xxxxxx
if ((int)(b[i++] & 0xc0) != 0x80) {
throw new IllegalArgumentException();
}
count++;
break;
case 14:
// 1110xxxx 10xxxxxx 10xxxxxx
if (((int)(b[i++] & 0xc0) != 0x80) ||
((int)(b[i++] & 0xc0) != 0x80)) {
throw new IllegalArgumentException();
}
count++;
break;
default:
// 10xxxxxx, 1111xxxx
throw new IllegalArgumentException();
}
}
if (i != max) {
throw new IllegalArgumentException();
....
guest 01.02.2010 19:28 # 0
guest 01.02.2010 19:48 # 0
Cdf-EaSy 02.02.2010 07:31 # 0
Почти весь код именно такой, комментарии может понять только программист их писавший, и оно еще и падает)
И гениальная на мой взгляд конструкция
(((int)(b[i++] & 0xc0) != 0x80) || ((int)(b[i++] & 0xc0) != 0x80))
Altravert 02.02.2010 12:39 # 0
guest 02.02.2010 12:44 # 0
Cdf-EaSy 02.02.2010 12:58 # 0
и int c = b[i++] & 0xff;
switch (c >> 4) {
Тоже нормально?
nil 02.02.2010 13:38 # 0
guest 02.02.2010 14:24 # 0
nil 02.02.2010 18:01 # 0
guest 02.02.2010 20:25 # 0
nil 02.02.2010 23:57 # 0
nil 02.02.2010 18:03 # 0
wvxvw 03.02.2010 03:11 # 0
EDIT: Хотя правильнее было бы стейт машину использовать, но так тоже можно в принципе...
Cdf-EaSy 03.02.2010 07:55 # 0
guest 04.02.2010 03:40 # +1
Altravert 04.02.2010 10:32 # 0