using (FileStream fStream = File.Create(@"F:\1.txt"))
{
using (BinaryWriter bWriter = new BinaryWriter(fStream))
{
bWriter.Write((int)0xAABBCC);
}
}按正常理解,文件内容应是这样:
00 AA BB CC
所以,当按字节读取并进行转化时应是这样:
using (FileStream fStream = File.Open(@"F:\1.txt", FileMode.Open))
{
byte[] bytes = new byte[4];
if (fStream.Read(bytes, 0, 4) == 4)
{
int number = [color=Red](bytes[0] << 24) + (bytes[1] << 16) + (bytes[2] << 8) + bytes[3][/color];
Console.WriteLine("0x" + number.ToString("X"));
}
}显示结果为:0xCCBBAA00,和原先的0xAABBCC不一样,为什么呢?用UltraEdit打开1.txt,可以看到实际保存为:

所以正确读取转化方法应为:
using (FileStream fStream = File.Open(@"F:\1.txt", FileMode.Open))
{
byte[] bytes = new byte[4];
if (fStream.Read(bytes, 0, 4) == 4)
{
int number = [color=Red](bytes[3] << 24) + (bytes[2] << 16) + (bytes[1] << 8) + bytes[0][/color];
Console.WriteLine("0x" + number.ToString("X"));
}
}测试下:

这回正常了。
为什么文件中保存的是CC BB AA 00,而不是00 AA BB CC呢?
用Reflector查看BinaryWriter.Write(int value)方法,代码如下:
public virtual void Write(int value)
{
this._buffer[0] = (byte) value;
this._buffer[1] = (byte) (value >> 8);
this._buffer[2] = (byte) (value >> 0x10);
this._buffer[3] = (byte) (value >> 0x18);
this.OutStream.Write(this._buffer, 0, 4);
}例如上边例子,经方法拆分后,this._buffer[0]=0xCC、this._buffer[1]=0xBB、this._buffer[2]=0xAA、this._buffer[3]=0,所以才会出现我们上边看到的结果。
为什么不写成:
public virtual void Write(int value)
{
this._buffer[0] = (byte)(value >> 0x18);
this._buffer[1] = (byte)(value >> 0x10);
this._buffer[2] = (byte)(value >> 8);
this._buffer[3] = (byte)value;
this.OutStream.Write(this._buffer, 0, 4);
}这样就很好理解了,不解,郁闷。。。😭
后记
使用C++、Java做一样的测试,C++结果同上,只有Java的结果是00 AA BB CC!
评论(0)
暂无评论。