我要实现的功能是 输入一个字符串(包含中文字符) 然后存储它到一个200字节的一个块中 然后将这个块存储到文件中  然后在从文件中读出响应块进行验证:代码如下//用于生成200字节的块
private string GetFormatString(string procedStr)
        {            StringBuilder retFormatString = new StringBuilder(procedStr, 200);            int length = UTF8Encoding.UTF8.GetByteCount(procedStr.ToCharArray());  //一开始没这句
            if (length < 200)
            {                retFormatString.Append('\t');
                for (int i = length + 1; i < 198; i++)
                {
                    retFormatString.Append((char)32);
                }
                retFormatString.Append((char)13); //198
                retFormatString.Append((char)10); //199
            }
            else
            {
                retFormatString[198] = (char)13;
                retFormatString[199] = (char)10;
            }
            return retFormatString.ToString();
        }//代码块 用于存储数据块到文件
using (StreamWriter Writer = new StreamWriter(formatFileSavePath, false))
                    {
                        while ((infoInLine = Reader.ReadLine()) != null)
                        {
                            string b = GetFormatString(infoInLine);
                            
                            Writer.Write(b.ToCharArray(),0,b.Length);
                            i++;
                            if (ALineHandleFinished != null)
                            {
                                ALineHandleFinished(i);     //触发行处理完毕事件
                            }
                        }
                    }//代码块 用于读出数据块
 using (FileStream Reader = new FileStream(textBox2.Text, FileMode.Open, FileAccess.Read))
                    {                        byte[] infoInLine = new byte[200];
                        Reader.Seek((a-1) * 200, SeekOrigin.Begin);
                        //MessageBox.Show(Reader.Position.ToString());
                        Reader.Read(infoInLine, 0, 200);
                        //MessageBox.Show(Reader.Position.ToString());
                        string d = UTF8Encoding.UTF8.GetString(infoInLine);
                        label1.Text = d;
                    }问题:一开始我没有int length = UTF8Encoding.UTF8.GetByteCount(procedStr.ToCharArray());这一句 然后在生成文件后 在验证老是出错... 最后发现有中文 就加了这句,现在这个功能已经实现..验证也正常
  但是我去翻了下书,才发现C#中一个Char型竟然是16bit的....(我以前学C++都认为他是8位的)......  现在我就更费解了如果一个char型是16位的 那么在我产生200字节块的时候他Append(char(10))时就应该是2byte的  那么在filestream.read返回byte[]时就应该返回错误的数据阿.......  但是验证是正确的........  怎么回事???到底怎么回事阿???? 我费解!!!

解决方案 »

  1.   

    unicode 一个 char 是两个字节=16位
      

  2.   

    char 
    范围:U+0000 到 U+ffff
    16 位 Unicode 字符
     
      

  3.   

    C#中的char类型是双字节的,存放得是unicode字符
      

  4.   

    嗯 我知道是16位的 
       但是帮忙看下我上面的代码 它为什么是正确的那???
                    retFormatString.Append((char)32);
                    retFormatString.Append((char)13); //198
                    retFormatString.Append((char)10); //199
    应该加进去的都是2byte 但是在read的时候 我seek到200的整数倍(按常理它应该不是200的整数倍) 还能取到正确的数据  为什么那??
      

  5.   

    比如我封装的是 字符串 "很奇怪" 3个子 那在循环开始是length = 6  一直循环到197 一共191次循环 共append 191个空格(char)32 也就是 191*2 = 382 byte 那么我要取 200byte的数据应该是错误的啊!
      

  6.   

    C#中的char类型是双字节的,存放得是unicode字符
      

  7.   

    unicode 编码中一个中文字符和英文字符都是一个单元,所以“很奇怪”应该length=3
      

  8.   

    建议看看msdn中 的编码规范部分
      

  9.   

    楼上的所说的编码规范我没有找到 能不能给个连接啊.. 谢谢
       对于9楼的 我可以很负责的说 他不是3  我用上面编码进行填充可以 肯定只要遇到的是字母和数字就会返回一个200length的字符串 如果中间有汉字 他的length就绝对不是200
      

  10.   

    int length = UTF8Encoding.UTF8.GetByteCount(procedStr.ToCharArray()); 一句返回的数字比procedStr.length要大(如果存在汉字的话!) 不知道怎么回事
      

  11.   

    而且大的不是2倍 如果包含3个汉字的话 length为30 而procedStr.length为24 也就是错了6个字节....不知原因为何... 费解ing