首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#打开SFX文件

C#打开SFX文件
EN

Stack Overflow用户
提问于 2022-10-18 11:26:21
回答 1查看 36关注 0票数 0

我有以下代码:

代码语言:javascript
复制
 using (var zip = new ZipArchive(passStream))
        {
            Pass = Json.Deserialize<Pass>(Encoding.UTF8.GetString(Json.ReadFully(zip.GetEntry("pass.json").Open())));

在zip.GetEntry行中,我得到了错误:

InvalidDataException:中心目录末尾预期的条目数与中央目录中的条目数不相对应。

我相当肯定这是因为正在处理的zip文件是一个SFX文件(我是用WinRar打开的,这就是它声明的格式)。文件是标准的Zip文件打开和处理刚刚好。此外-如果我双击SFX格式压缩文件直接在窗口,我得到一个错误状态‘压缩文件夹XXXXXXXXXXX是无效的’。如果我双击标准压缩文件,它们就会打开。

是否有一个内置的方式来处理C#中的SFX文件。我已经探索了System.IO.Compression的名字空间,没有看到任何东西。

如果.net / C#中没有任何内容,那么是否有一个nuget包可以完成这一任务。我已经看过其中的许多,没有发现任何具体声明他们处理SFX文件。如能提供任何协助,将不胜感激。

基于##UPDATED## @Shingo提供的信息,我做了以下工作:

代码语言:javascript
复制
        var bs = new BufferedStream(fs);
        int b;

        bs.Position = 0;

        while ((b = bs.ReadByte()) != -1)
        {
            if (b == 0x50)
            {
                var p = bs.Position;
                if (bs.ReadByte() == 0x4b &&
                   bs.ReadByte() == 0x03 &&
                   bs.ReadByte() == 0x04)
                {

                    //Copy from the current location (Positiong 6) to the new stream. This will remove the first 6 positions (index 0 -5) 
                    var tobj_NewStream = new MemoryStream();
                    bs.CopyTo(tobj_NewStream);
                    bs.Close();

                    using (var zip = new ZipArchive(tobj_NewStream))
                    {
                        var ti_Entries = zip.Entries.Count();
                    }
                    break;
                }
                else
                {
                    bs.Position = p + 1;
                }
            }
        }

在SFX字符之后,数组中的前几个条目是20、0、8、8、8、0。在创建了新的流之后,我验证了它是从索引0-5中的系列开始的,并且做到了。但是,当我将流加载到ZipArchive中时,仍然无法看到/访问其中的条目。我收到的错误消息与我一直收到的错误消息相同:

“中央目录”结尾项的System.IO.InvalidDataException HResult=0x80131501 Message=Number与“中央目录”中的条目数不相对应。Source=System.IO.Compression

还有其他建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-18 14:00:00

下面是一个简单的例子,您可以尝试一下。

代码语言:javascript
复制
var bs = new BufferedStream(filestream);
int b;

while((b = bs.ReadByte()) != -1)
{
    if(b == 0x50)
    {
        var p = bs.Position;
        if(bs.ReadByte() == 0x4b &&
           bs.ReadByte() == 0x03 &&
           bs.ReadByte() == 0x04)
        {
            var ms = new MemoryStream();
            filestream.Position = p - 1;
            filestream.CopyTo(ms);

            using (var zip = new ZipArchive(ms))
            {
                //...
            }
            break;
        }
        else
        {
            bs.Position = p;
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74110179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档