关于C#Int16的二进制读写问题
今天发现了一段代码,就扫描了下,感觉应该挺简单的,但是结果却让我和失望,感觉有的本质的东西还是没有掌握,下为代码:
static void Main(string[] args)
{
//写入数字
string filePath;
Console.WriteLine("请输入需要创建的二进制文件路径(包括文件名)");
filePath = Console.ReadLine();
FileStream fileStream = new FileStream(filePath, FileMode.Create);
BinaryWriter writer = new BinaryWriter(fileStream);
for (int index = 0; index < 20; index++)
{
writer.Write(index);
}
Console.WriteLine("写入完毕");
writer.Close();
fileStream.Close();
}
我输入的测试用例为 F:test.txt;下面的代码是对刚刚写的文件进行读操作:
static void Main(string[] args)
{
//读入数据
Console.WriteLine("请输入文件名:");
string filePath = Console.ReadLine();
if (!File.Exists(filePath))
{
Console.WriteLine("文件不存在。");
}
else
{
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(fileStream);
try
{
while (true)
{
Console.WriteLine(reader.ReadInt16());
}
}
catch (EndOfStreamException)
{
Console.WriteLine("已经到文件尾部了");
}
finally
{
reader.Close();
fileStream.Close();
Console.ReadKey();
}
按照我的猜想,答案应该为:0 0 0 1 0 2 0 3....0 19
但是结果很吃惊:

可能关键字不对吧,总是找不到相关的资料,所以来坛子里问问。
[解决办法]
不知道你说的啥。
计算机内存是以字节为单位进行编址的,也就是说一个内存地址所对应的单元中只能存放一个字节,当要存放一个字(16位)时,需要占用两个字节,那么高字节存放到高地址单元中,低字节存放到低地址单元中,如果内存单元从前到后地址是从低到高的话,那一个字存储时就是底位在前高位在后。
是不是想要的这个。
书上不是教过嘛?
[解决办法]
高低位的顺序取决于OS的Unicode的格式。
以下内容来自MSDN
UnicodeEncoding 与 Windows 代码页 1200(Little-Endian 字节顺序)和 1201(Big-Endian 字节顺序)对应。
编码器可以使用 Big-Endian 字节顺序(从最高有效字节开始),也可以使用 Little-Endian 字节顺序(从最低有效字节开始)。
例如,大写拉丁字母 A(码位为 U+0041)的序列化结果(十六进制)如下所示:
Big-endian 字节顺序:00 00 00 41
Little-endian 字节顺序:41 00 00 00
通常,使用本机字节顺序存储 Unicode 字符的效率更高。
例如,在 Little-endian 平台(如 Intel 计算机)上最好使用 Little-endian 字节顺序。
或者, UnicodeEncoding 对象提供一个前导码(即一个字节数组),可以将它作为编码过程中所产生的字节序列的前缀。
[解决办法]
0x12345678在内存的存储方式为 78 56 34 12,是反序储存
例如int32 i=1 ,占4位,在内存中表示为 01 00 00 00
使用blockcopy转换为int16[2],则第一个元素为 01 00,第二个元素为 00 00
输出则变为1,0