欢迎光临

木子屋

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

作者: dnawo

日期: 2011-12-23 11:36 AM

分类: Win编程

内容: 下边代码用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)

登录

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 1.918 ms

返回

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

你没有权限发表评论

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 1.918 ms

返回

暂无评论

返回

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 1.965 ms

返回