为啥在写入文件之前转移一个 int?

Posted

技术标签:

【中文标题】为啥在写入文件之前转移一个 int?【英文标题】:Why shifting an int before writing to a file?为什么在写入文件之前转移一个 int? 【发布时间】:2018-12-03 06:46:09 【问题描述】:

我正在反转文件编写器的源代码,这里是读/写 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);
        

那么,你能解释一下为什么总是相同的 255(11111111) 的 & 和移位吗?

附:我需要这篇文章,并且会给你信用。如果您愿意,可以在这里查看,或者在 codeproject 上查看:Sequential-byte-serializer

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

【问题讨论】:

这就是你获取值的最低和下 8 位的方式 这是控制字节序的方法 (en.wikipedia.org/wiki/Endianness)。 这与字节序有什么关系? 【参考方案1】:

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

【讨论】:

有人可能会说 &amp; 是多余的,因为转换为 byte 已经只占用了低位 @Rotem 你是对的 (***.com/questions/7575643/…),但也许代码的作者没有意识到这一点,或者他想明确说明 现在我很好奇编译器是否会忽略 IL 中的 &amp; @Rotem 这个代码来自 ILSpy,所以没有:IL_0001: ldarg.1 IL_0002: ldc.i4 255 IL_0007: and IL_0008: conv.ovf.u1 IL_0009: stloc.0

以上是关于为啥在写入文件之前转移一个 int?的主要内容,如果未能解决你的问题,请参考以下文章

写入文件后,为啥 os.path.getsize 仍然返回之前的大小?

为啥将许多小字节数组写入文件比写入一个大数组要快?

软件安装显示“不能打开要写入的文件”怎么办?

为啥向HttpServletResponse中写入相应正文之后,就无法用setHeader()方法改变响应头了。

为啥 Apache + PHP 需要执行权限才能写入文件?

为啥我的追加功能不再写入文件