Кодирование байтов в ushort и обратно

Я пытаюсь сохранить два байта в ushort. Таким образом, первые 8 бит — это первое значение, а 8 последних бит — последнее. У меня почти все работает, но эта ошибка в строке 20, где я немного сдвигаю:

Severity    Code    Description Project File    Line    Suppression State
Error   CS0266  Cannot implicitly convert type 'int' to 'ushort'. An explicit conversion exists (are you missing a cast?)   Bit Stuff   C:\Users\perqj\Dropbox\GM\Bit Stuff\Bit Stuff\Form1.cs  42  Active

Вот код:

        byte val1 = 1;
        byte val2 = 1;

        byte[] val = new byte[2];

        val[0] = val1;
        val[1] = val2;

        ushort asShort = BitConverter.ToUInt16(val, 0);

        ushort mask1 = 0x00ff; //0b_0000_0000_1111_1111    Haven't tried, yet
        ushort mask2 = 0xff00; //0b_1111_1111_0000_0000    Haven't tried, yet

        ushort short1 = asShort;
        ushort short2 = asShort;
        ushort byteShift = 8;

        short1 &= mask1;
        short2 &= mask2;

        short2 = short2 >> byteShift;

        string binaryMask1 = Convert.ToString(mask1, 2);
        string binaryMask2 = Convert.ToString(mask2, 2);
        string binaryShort1 = Convert.ToString(short1, 2);
        string binaryShort2 = Convert.ToString(short2, 2);

        listBox1.Items.Add("val1: " + val1);
        listBox1.Items.Add("val2: " + val2);
        listBox1.Items.Add("Short: " + asShort);
        listBox1.Items.Add("mask1: " + mask1 + "  " + binaryMask1);
        listBox1.Items.Add("mask2: " + mask2 + "  " + binaryMask2);
        listBox1.Items.Add("val1: " + short1 + "  " + binaryShort1);
        listBox1.Items.Add("val2: " + short2 + "  " + binaryShort2);

person DrDress    schedule 22.02.2021    source источник
comment
Да, результат битового сдвига int, но, как говорит ошибка, вы можете добавить приведение: short2 = (ushort) (short2 >> byteShift); Вы можете обнаружить, что short2 >>= byteShift; тоже работает - это эквивалентно, только с неявным приведением.   -  person Jon Skeet    schedule 22.02.2021
comment
Ах. Конечно, битовый сдвиг возвращает целое число. Почему я не подумал об этом. Спасибо, теперь работает   -  person DrDress    schedule 22.02.2021


Ответы (1)


Я обычно использую такой код:

    class Program
    {
        static void Main(string[] args)
        {
            byte[] input = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
            Data[] output = input.Select((x,i) => new {x = x, i = i}).GroupBy(x => x.i/2).Select(x => new Data() { upper = x.First().x, lower = x.Last().x}).ToArray(); 
        }
    }
    public class Data
    {
        public byte upper { get; set; }
        public byte lower { get; set; }
    }
person jdweng    schedule 22.02.2021
comment
Не сразу понятно, как это связано с этим вопросом - где проблема может быть решена с помощью простого приведения. - person Jon Skeet; 22.02.2021