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

Nig*_*gel 1 c# reverse-engineering

我正在逆转文件编写器的源代码,这里是读/写int(或者更确切地说是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);
        }
Run Code Online (Sandbox Code Playgroud)

所以,你能解释一下为什么&255(11111111)总是一样的和变化?

PS我需要这篇文章,并会给你信任.您可以在此处查看,也可以在codeproject上查看:Sequential-byte-serializer

谢谢你的兴趣.积分已经给了@Sentry和@Rotem.当文章获得批准时,我还会发布codeproject url

Sen*_*try 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
Run Code Online (Sandbox Code Playgroud)

然后

## 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
Run Code Online (Sandbox Code Playgroud)

所以你有两个字节代表16位int的高低部分

  • @Rotem此代码来自ILSpy,所以没有:IL_0001:ldarg.1 IL_0002:ldc.i4 255 IL_0007:和IL_0008:conv.ovf.u1 IL_0009:stloc.0 (2认同)