Как прочитать 16-битное число из файла C#? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть требование, которое включает некоторый уровень битовых операций. У меня нет опыта работы с битами.

Из байта файла мне нужно выбрать пятый и шестой байт.

enter image description here

и необходимо вычислить значение по этой формуле, которая объясняется следующим образом для данного примера

байт 5 - LSB, байт 6 MSB. В примере смещение будет 598 (LSB * (MSB << 8)) </p>

Как они получили 598 для данного примера?

Я знаю, что LSB означает младший бит, а MSB является старшим битом.

Значит, 8 - это младший бит 5-го байта, а 0 - старший бит шестого байта?

Или мне нужно преобразовать 98 и 05 в биты, а затем нужно выяснить эти два значения?

Я хочу закодировать эту формулу в C#.

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Вам не нужно иметь дело с отдельными битами. Это шестнадцатеричные значения, поэтому 98 - это однобайтный, а 05 - однобайтный.

Тоже похоже есть ошибка при конвертации. Вам нужно добавить LSB к сдвинутому MSB, а не умножить. 598 = 0x98 + (0x05 << 8). Оператор << 8 сдвигает ваш MSB на один байт (так же, как умножение его на 256). </p>

Байт в позиции индекса 5: 98 (шестнадцатеричный)
Байт в позиции индекса 6 равен : 05 (шестнадцатеричный)

В этом случае результат будет 0598 или 589 (шестнадцатеричный)

Если вы сделаете математику в C#, вы, вероятно, увидите результат как целое число, что составляет 1432.

0 голосов
/ 07 мая 2020

MSB также означает Most significant byte.

    var data = new byte[] { 0xA9, 0x43, 0x50, 0x49, 0x00, 0x98, 0x05, 0x28 };

    ushort value = BitConverter.ToUInt16(data, 5);

    Console.WriteLine(value.ToString("X4"));

BitConverter.ToUInt16 будет читать два байта из массива data, начиная с индекса 5, то есть 0x98 и 0x05. Затем он применит формулу для вычисления результата, который равен 0x0598.

Формула зависит от архитектуры процессора Порядок байтов

BitConverter.ToUInt16

...