| 犬者 |
| “说了你又不听,听又不懂,懂又不做,做又做错,错又不认,认又不改,改又不服,不服也不说,那叫我怎么办?!” |
|
【电脑】动态修改.Net StreamReader Encoding编码 在.Net framework中StreamReader的使用encoding必须在构造器中指定,而且中途完全不可以更改。 代码就不贴了,只讲原理。 Stream Reader其实很简单,它内部有两个Buffer,一个是input buffer,一个是decoded buffer,前者用于缓存从base stream读过来的原始数据,后者用于缓存根据原始数据解码出来后的东西……只要看明白mono的实现中ReadBuffer这个方法,要动态修改CurrentEncoding也就不是太难了…… 我需要处理的网络协议是一个行协议……偶在程序中只调用了StreamReader的Readline方法,而完全没有使用Read的两个方法,这也使得偶动态修改编码容易了许多…… 偶的做法是每次调用Readline的时候,不仅移动decoded buffer的游标(pos),同时也移动input buffer一个新的游标(pos_input),做法很简单,Readline方法需要调用FindNextEOL移动游标查找换行符号……我在FindNextEOL方法添加多一行: 而FindNextInputEOL这个新的函数,完全是FindNextEOL的翻版,只是前者处理input buffer,而后者处理decoded buffer…… 如此一来,我便可以知道每次Readline之后,input buffer中还没有被上层读到的原始数据有哪些了…… 然后,再把CurrentEncoding属性添加Set的方法: 设定新编码时,程序便根据input buffer的游标(pos_input)把没有被读到的原始数据重新decode一次,并且替换掉decoded buffer中的内容。 然后,事情就搞定了……甚至不需要对Readline方法做任何修改……除了把cbEncoded这个变量放到全局里面外…… 但是,偶这个修改使得Read的两个方法变得完全不可以用……一旦调用了……便会使得input buffer与decoded buffer里面两个游标不同步……这里有完整的代码,还望有大侠可以帮忙把Read的两个方法也给搞定了…… 先谢过…… 问天 @9/5/2006 11:11:27 PM View blogs in this category:电脑 Please leave your comment here |
Navigation
Blogwind犬者首页 Contact 个人档案 ![]() “说了你又不听,听又不懂,懂又不做,做又做错,错又不认,认又不改,改又不服,不服也不说,那叫我怎么办?!”
Categories
死结(27)电脑(169) 心情(175) 天影(25) 乱弹(204) 博客(78) 音乐(18) 饕餮(30) 读书(19) 电影(26) 网摘(5) 希望(30) 汕头(10) 经济(5) 苹果(19) 跋涉(3)
Archive
2008年7月2008年6月 2008年5月 2008年4月 2008年3月 2008年2月 2008年1月 2007年12月 2007年11月 2007年10月 2007年9月 2007年8月 2007年7月 2007年6月 2007年5月 2007年4月 2007年3月 2007年2月 2007年1月 2006年12月 2006年11月 2006年10月 2006年9月 2006年8月 2006年7月 2006年6月 2006年5月 2006年4月 2006年3月 2006年2月 2006年1月 2005年12月 2005年11月 2005年10月 2005年9月 2005年8月 2005年7月 2005年6月 2005年5月 2005年4月 2005年3月 2005年2月 2005年1月 2004年12月 2004年11月 2004年10月 2004年9月 2004年8月 2004年7月 2004年6月 2004年5月 2004年4月 2004年3月 2004年2月 2004年1月 2003年12月
My Links
bloglines时尚摄影师奇科的博客 我们的漫画 颜如玉 最爱卫斯理 |