这是写进的内容 private  void SaveAsBxt(StringBuilder temContent)
        {
            string fPath = @"E:\downTest\baidu\content.bxt";
            int fileCount = _SectionsGather.LocalImagesPaths.Count+1;
            fileCount = 5;
            FileStream fs = new FileStream(fPath, FileMode.Create,FileAccess.Write);
            BinaryWriter bw = new BinaryWriter(fs);
            bw.Write("FileType:bxt");
            //bw.Write((char)13);
            bw.Write("Version:1.0");
            //bw.Write((char)13);
            bw.Write(fileCount);
            bw.Write((char)13);
            string txt = temContent.ToString();
            byte[] btContent = Encoding.GetEncoding("GB2312").GetBytes(txt);
            //写入文件长度
            bw.Write((long)btContent.Length);
            for (int i = 0; i < _SectionsGather.LocalImagesPaths.Count; ++i)
            {
               byte[] temBt = File.ReadAllBytes(_SectionsGather.LocalImagesPaths[i]);
               bw.Write((long)temBt.Length);
            }
            //写入文件名
            bw.Write("content.txt");
            for (int i = 0; i < _SectionsGather.LocalImagesPaths.Count; ++i)
            {
                bw.Write(_SectionsGather.LocalImagesPaths[i]);
            }
            //写入内容
            bw.Write(btContent);
            for (int i = 0; i < _SectionsGather.LocalImagesPaths.Count;++i )
            {
                //TODO:此处改成文件名,而不是路径
                bw.Write(Path.GetFileName(_SectionsGather.LocalImagesPaths[i]));
            }
            fs.Close();
            bw.Close();        }这是读取的方法
FileStream fs = new FileStream(filePath, FileMode.Open);
            BinaryReader br = new BinaryReader(fs);
            int fileCount = br.ReadInt32();
            wb.DocumentText = fileCount.ToString();
            return;
            br.BaseStream.Position = 0;
            string type = br.ReadString();
            string version = br.ReadString();
            string testUrl = br.ReadString();
            
            string webContent ="version:" + version + "<br />testUrl:" + testUrl + "<br />FileCount:" + fileCount;
           
            wb.DocumentText = webContent;            fs.Close();
            br.Close();
我就郁闷了,读取出的fileCount应该是5才对。但这里却是1818838540,请教是怎么回事

解决方案 »

  1.   

    这个提有意思啊首先说楼主认为得5 是不对
    因为在写的时候最先写的是bw.Write("FileType:bxt");
    其次是bw.Write("Version:1.0");
    最后才是bw.Write(fileCount); //fileCount =5
    所以在读流的时候,在0位置处开始的取整形不可能是5;BinaryWriter ..::.Write 方法 (String)
    将有长度前缀的字符串按 BinaryWriter 的当前编码写入此流,并根据所使用的编码和写入流的特定字符,提升流的当前位置简单说就是在写如字符串之前,先把字符串的长度写进去。
    "FileType:bxt" 长度是12个 也就是十六进制0xC
    然后写
    F 0x46
    i 0x69
    l 0x6c
    e 0x65
    ……
    文件中的字符序列是0c46696c65...............在读的时候
    BinaryReader br = new BinaryReader(fs);
    int fileCount = br.ReadInt32();
    文件0位置开始处四个字节取整型0x6c69460c (小端表示)对应十进制 1818838540
    希望楼主看明白了
      

  2.   

    刚才忘了补充一下
    因为使用的是BinaryWriter 构造函数 (Stream)
    用 UTF-8 作为字符串编码来初始化 BinaryWriter 类的新实例。
    所以以上的推断是成立的。
    不同编码可能得到的值不同,楼主可自行调试。
    使用BinaryWriter 构造函数 (Stream, Encoding)