首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于C#Int16的二进制读写有关问题

2013-02-18 
关于C#Int16的二进制读写问题今天发现了一段代码,就扫描了下,感觉应该挺简单的,但是结果却让我和失望,感觉

关于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 
但是结果很吃惊:
关于C#Int16的二进制读写有关问题
 
可能关键字不对吧,总是找不到相关的资料,所以来坛子里问问。
[解决办法]
不知道你说的啥。
计算机内存是以字节为单位进行编址的,也就是说一个内存地址所对应的单元中只能存放一个字节,当要存放一个字(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

热点排行