1. C# / Говнокод #3682

    +117

    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
    36. 36
    37. 37
    static int ReadEvent (byte [] source, int off, int size, out InotifyEvent evt)
    {
        evt = new InotifyEvent ();
        if (size <= 0 || off > size - 16) {
            return -1;
        }
    
        int len;
        if (BitConverter.IsLittleEndian) {
            evt.WatchDescriptor = source [off] + (source [off + 1] << 8) +
                        (source [off + 2] << 16) + (source [off + 3] << 24);
            evt.Mask = (InotifyMask) (source [off + 4] + (source [off + 5] << 8) +
                        (source [off + 6] << 16) + (source [off + 7] << 24));
            // Ignore Cookie -> +4
            len = source [off + 12] + (source [off + 13] << 8) +
                (source [off + 14] << 16) + (source [off + 15] << 24);
        } else {
            evt.WatchDescriptor = source [off + 3] + (source [off + 2] << 8) +
                        (source [off + 1] << 16) + (source [off] << 24);
            evt.Mask = (InotifyMask) (source [off + 7] + (source [off + 6] << 8) +
                        (source [off + 5] << 16) + (source [off + 4] << 24));
            // Ignore Cookie -> +4
            len = source [off + 15] + (source [off + 14] << 8) +
                (source [off + 13] << 16) + (source [off + 12] << 24);
        }
    
        if (len > 0) {
            if (off > size - 16 - len)
                return -1;
            string name = Encoding.UTF8.GetString (source, off + 16, len);
            evt.Name = name.Trim ('\0');
        } else {
            evt.Name = null;
        }
    
        return 16 + len;
    }

    Mono, обёртка вокруг INotify (вокруг папки INotify создаёт поток (файл?), который нужно с помощью read читать в буфер, и в буфере будет лежать объект-событие в говносериализованной форме).

    Давно столько магических чисел в одном месте не видел o_O

    Можно ли в C# решить элегантнее?
    Аналог всего этого кода на Си: struct inotify_event *event = ( struct inotify_event*) &buffer[i]

    Запостил: cfdev, 11 Июля 2010

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

    • BTW, этот код реализует класс System.IO.FileSystemWatcher под Линапс выше 2.6.13
      Ответить
    • Можно обернуть byte[] в MemoryStream, создать на его базе StreamReader.
      Ответить
      • Пострадает ли производительность?
        Ответить
        • Естественно. Одно дело - указатель присвоить, и совсем другое - массив расчитывать.
          Ответить
    • Если есть возможность использовать unsafe-код, то можно использовать что-то вроде этого:
      fixed (void* ptr = source)
      {
      evt = *((InotifyEvent*)ptr[offset]);
      }
      Ответить

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