Введение
Я хотел бы извлечь некоторые невыровненные данные. из массивов байтов, где указаны
- позиция начального бита
- количество битов
- независимо от того, имеют ли данные формат «сначала старший бит (с обратным порядком байтов)» или «сначала младший бит» (с прямым порядком байтов)
Код: Выделить всё
ulong ReadRaw(byte[] src, int startBit, int bitLength, Endianness endianness = Endianness.LSB_FIRST)
Поскольку аргументы представляют собой константы, известные во время компиляции, я мог бы жестко запрограммировать быстрый вариант, вручную находя, какие биты нужно извлечь и как их сдвинуть.
Например. следующие два присваивания raw делают то же самое:
Код: Выделить всё
ulong raw;
// Manually extract bits
raw = ((ulong)(src[5] & 0xFC) >> 2) + ((ulong)(src[6] & 0x3)
Подробнее здесь: [url]https://stackoverflow.com/questions/75015758/c-sharp-source-generators-generate-different-code-for-calls-to-the-same-method[/url]