Правильный способ преобразования 3 байтов Span в int - PullRequest
0 голосов
/ 25 мая 2020

Я знаю, я могу преобразовать 3 байта Span в массив байтов, преобразовав каждый байт отдельно и объединяя в целое число. Я также могу объединить 1-байтовый массив с 3-байтовым массивом, преобразованным из Span, и использовать класс BitConverter. Эти методы старые и хорошо известные, но я рассматриваю, есть ли лучший способ сделать это, особенно при использовании Span, например: mySpan.Slice(10, 3).

1 Ответ

3 голосов
/ 25 мая 2020

Проблема в том, что 3 байта - это действительно неудобное число, так как нет доступного размера регистра в 3 байта. Один из способов - разделить его на 2 байта и 1 байт и | их вместе:

var arr = new byte[] { 5, 20, 10 };
var span = arr.AsSpan();

var val = MemoryMarshal.Cast<byte, ushort>(span.Slice(1))[0] << 16 | (span[0] << 8);

Ассемблерный код, сгенерированный JIT, представляет собой просто прямые копии (lea) и сдвиги (shr), как и ожидалось, это просто синтаксис C#, который немного громоздок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...