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

使用ICSharpCode.SharpZLib,读取Tar.gz压缩包的文件名乱码有关问题

2012-06-20 
使用ICSharpCode.SharpZLib,读取Tar.gz压缩包的文件名乱码问题默认版本的库文件读取时会将tar包中的中文路

使用ICSharpCode.SharpZLib,读取Tar.gz压缩包的文件名乱码问题
默认版本的库文件读取时会将tar包中的中文路径读成乱码,两种方案, 第一种方法,不改SharpZLib的源代码,将读出的Entry名称进行如下转换:privatestring ParseName(string source){byte[] sourceByte =new byte[source.Length];for (int i = 0; i < source.Length; i++){sourceByte[i] = (byte)source[i];}returnEncoding.Default.GetString(sourceByte);}  即可将其转化为正常,注:SharpZLib中,是将byte[]数组中的每一个元素强制转化为char,然后再拼成string,所以会出现乱码,这里的处理是将其恢复原来的byte[]数组,再使用gb2312的编码解出来,得到中文   第二种方法,修改SharpZLib的源代码(有风险,未详细测试)将TarHeader.cs中的ParseName函数改为下文所示,可解决这一问题: staticpublic String ParseName(byte[] header,int offset, int length)        {            if ( header ==null ) {                thrownew ArgumentNullException("header");            }            if ( offset < 0 ) {#if NETCF_1_0                throw new ArgumentOutOfRangeException("offset");#else                thrownew ArgumentOutOfRangeException("offset","Cannot be less than zero");#endif                            }            if ( length < 0 )            {#if NETCF_1_0                throw new ArgumentOutOfRangeException("length");#else                thrownew ArgumentOutOfRangeException("length","Cannot be less than zero");#endif                            }            if ( offset + length > header.Length )            {                thrownew ArgumentException("Exceeds header size","length");            }//StringBuilder result = new StringBuilder(length);            //for (int i = offset; i < offset + length; ++i) {// if (header[i] == 0) {// break;// }// result.Append((char)header[i]);//}            //return result;int tmpCount = 0;for (int i = offset; i < offset + length; ++i){if (header[i] == 0){break;}else tmpCount++;}byte[] bytes =new byte[tmpCount];for (int i = offset; i < offset+tmpCount; i++){bytes[i] = header[i]; }string res = System.Text.Encoding.Default.GetString(bytes);return res;        }

热点排行