为什么在写入文件之前先移动int?

时间:2018-06-24 14:26:00

标签: c# reverse-engineering

我正在反转文件编写器的源代码,以下是读取/写入整数(或更确切地说是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)总是相同并且发生偏移吗?

P.S。我需要这篇文章,并且会给你信誉。您可以根据需要在此处进行检查,也可以在codeproject上进行检查:Sequential-byte-serializer

感谢您的关注。积分已计入@Sentry和@Rotem。文章获得批准后,我还将发布codeproject网址

1 个答案:

答案 0 :(得分:7)

该代码将一个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位int的高低部分