C#使用BinaryWriter.Write存取数字示例

下边代码用4个字节在文件中保存了一个数字(0xAABBCC):

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 = (bytes[0] << 24) + (bytes[1] << 16) + (bytes[2] << 8) + bytes[3];
        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 = (bytes[3] << 24) + (bytes[2] << 16) + (bytes[1] << 8) + bytes[0];
        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 | 引用: 0 | 查看次数: 8373
发表评论
登录后再发表评论!