为啥在写入文件之前转移一个 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 的高位和低位
【讨论】:
有人可能会说&
是多余的,因为转换为 byte
已经只占用了低位
@Rotem 你是对的 (***.com/questions/7575643/…),但也许代码的作者没有意识到这一点,或者他想明确说明
现在我很好奇编译器是否会忽略 IL 中的 &
。
@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 仍然返回之前的大小?