Зачем сдвигать int перед записью в файл? - PullRequest
0 голосов
/ 24 июня 2018

Я переворачиваю исходный код средства записи файлов, и вот методы, которые читают / записывают целые числа (или, скорее, ushorts):

        BinaryReader _Reader;
        BinaryWriter _Writer;

        void RawWriteInt16(int value)
        {
            byte a = (byte)(value & 255);
            byte b = (byte)(value >> 8 & 255);
            _Writer.Write(a);
            _Writer.Write(b);
        }
        ushort RawReadUInt16()
        {
            int num = _Reader.ReadByte();
            int num2 = _Reader.ReadByte();
            return (ushort)((num2 << 8) + num);
        }

Итак, вы можете объяснить, почему & с 255 (11111111) который всегда одинаков и смещается?

PS Мне нужно это для статьи, и я дам вам кредит.Вы можете проверить это здесь, если хотите, или на codeproject: Последовательный-байтовый сериализатор

Спасибо за интерес.Кредиты были предоставлены @Sentry и @Rotem.Я опубликую также URL кода проекта, когда статья будет одобрена

1 Ответ

0 голосов
/ 24 июня 2018

Этот код превращает 16-разрядное целое число в два (8-разрядных) байтовых значения:

## byte a = (byte)(value & 255); ##

(int)value:    1101 0010 0011 1000
(int)  255:    0000 0000 1111 1111
 bitwise &:    0000 0000 0011 1000
   to byte:              0011 1000

, а затем

## byte b = (byte)(value >> 8 & 255); ##

(int)value:    1101 0010 0011 1000
      >> 8:    0000 0000 1101 0010 
(int)  255:    0000 0000 1111 1111
 bitwise &:    0000 0000 1101 0010
   to byte:              1101 0010

Итак, у вас есть два байта, которые представляют верхнюю и нижнюю часть 16-битного целого числа

...