我要实现的功能是 输入一个字符串(包含中文字符) 然后存储它到一个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[]时就应该返回错误的数据阿....... 但是验证是正确的........ 怎么回事???到底怎么回事阿???? 我费解!!!
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[]时就应该返回错误的数据阿....... 但是验证是正确的........ 怎么回事???到底怎么回事阿???? 我费解!!!
范围:U+0000 到 U+ffff
16 位 Unicode 字符
但是帮忙看下我上面的代码 它为什么是正确的那???
retFormatString.Append((char)32);
retFormatString.Append((char)13); //198
retFormatString.Append((char)10); //199
应该加进去的都是2byte 但是在read的时候 我seek到200的整数倍(按常理它应该不是200的整数倍) 还能取到正确的数据 为什么那??
对于9楼的 我可以很负责的说 他不是3 我用上面编码进行填充可以 肯定只要遇到的是字母和数字就会返回一个200length的字符串 如果中间有汉字 他的length就绝对不是200