1. Java / Говнокод #2517

    +65.5

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 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();
    ....

    В либе работы с зипом

    Запостил: Cdf-EaSy, 01 Февраля 2010

    Комментарии (16) RSS

    • Где здесь C++?
      Ответить
    • какой-то очень уж неочевидный ГК, не могли бы вы прояснить ситуацию немного?
      Ответить
    • Это java.util.zip
      Почти весь код именно такой, комментарии может понять только программист их писавший, и оно еще и падает)
      И гениальная на мой взгляд конструкция
      (((int)(b[i++] & 0xc0) != 0x80) || ((int)(b[i++] & 0xc0) != 0x80))
      Ответить
      • И что в ней? Порядок вычислений непонятен?
        Ответить
        • А он и не важен.
          Ответить
        • Вы считаете такой метод написания кода хорошим и читаемым?
          и int c = b[i++] & 0xff;
          switch (c >> 4) {
          Тоже нормально?
          Ответить
          • Правда Ваша, надо в одну строчку записать.
            Ответить
            • И 0xff убрать, наверное ;-)
              Ответить
              • Кстати, да, останется 0x0f.
                Ответить
                • Мммм... А совсем убрать нельзя? В массиве b байты же.
                  Ответить
                  • Я явы не знаю, там что такое байт? беззнаковый? А то полезет какой-нибудь знак во все разряды, кто его знает...
                    Ответить
      • Эх... К такому коду только outb не хватает! Наверное, ядерный чувак писал.
        Ответить
    • Говнокода не увидел... код просто с ошибками (делаются 2 итерации вместо одной там, где это не нужно). И как раз это можно понять по коментариям не лазя в спецификацию :S

      EDIT: Хотя правильнее было бы стейт машину использовать, но так тоже можно в принципе...
      Ответить
      • Это не ошибка с 2мя итерациями, так и задумывалось)
        Ответить
    • не ГК. нормальный парсинг utf-8. читайте rfc что бы понять что происходит.
      Ответить

    Добавить комментарий