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

来源:互联网 发布:mac口红铁锈红图片 编辑:程序博客网 时间:2024/06/06 07:12
默认版本的库文件读取时会将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;
        }

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 橡皮把桌面油漆弄掉了怎么办 手机被调成静音不知道放哪了怎么办 金丝熊吃大米吃撑了怎么办 部落有可疑记录被暂时禁封怎么办 鼻子通向嘴那里痒得难受怎么办 小孩上嘴唇中间的连线碰掉了怎么办 秋田犬夏天退毛严重么 怎么办 初中数学基本没学过高中怎么办 老师家纺突然想日语文老师怎么办 微信聊天表情小企鹅不动了怎么办 微信自带小表情不全怎么办 爱奇艺电视果有图像无声音怎么办 微信表情包保存不到手机相册怎么办 才出生的兔宝宝被母兔抓伤了怎么办 老婆生气了说恨我一辈子我该怎么办 华为手机微信表情不显示含义怎么办 地下城游戏登录链接一直失败怎么办 聊天时别人打听家人不想回答怎么办 微信钱包零钱密码忘了怎么办 斗图我能怎么办我也很无奈 微信解冻设备不一致申诉失败怎么办 看不懂微信脸部表情什么意思怎么办 有的动图图片过大微信发不了怎么办 微信漂流瓶扔瓶子没有人回复怎么办 删了微信 手贱 添加 怎么办 姨妈弄到床垫上拆不下来洗怎么办 碰到情商智商都高的小人怎么办 微信聊天界面右上角的小人头怎么办 最近摸高摸到的高度越来越矮怎么办 每次孕检显示小孩子体型大怎么办? 阴阳师纸片人蓝色锦囊点掉了怎么办 抱孩子把腰闪了动不了在家怎么办 餐厅客人中有儿童服务时怎么办 脊柱胸段向右侧凸要怎么办 玩球球大作战不小心开自由了怎么办 小孩哭脸后喝水呛着了怎么办 摔跤引起的脸部半边儿僵硬怎么办 老人受了刺激大笑不止是怎么办 想让父母陪着玩 没时间怎么办 开过光的百家锁东西别人碰了怎么办 兔兔助手描述文件变了存档怎么办