Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的二进制补丁生成#_C#_File_Patch - Fatal编程技术网

C# C语言中的二进制补丁生成#

C# C语言中的二进制补丁生成#,c#,file,patch,C#,File,Patch,是否有人拥有或知道C#中的二进制补丁生成算法实现 基本上,比较两个文件(指定为旧文件和新文件),并生成一个补丁文件,该文件可用于升级旧文件,使其内容与新文件相同 实现速度必须相对较快,并且需要处理大量文件。它应该展示O(n)或O(logn)运行时 我自己的算法要么很糟糕(速度快,但生成的补丁很大),要么很慢(生成的补丁很小,但运行时间为O(n^2)) 任何关于实现的建议或指针都很好 具体来说,该实现将用于使服务器与我们有一个主服务器的各种大型数据文件保持同步。当主服务器数据文件更改时,我们还需要

是否有人拥有或知道C#中的二进制补丁生成算法实现

基本上,比较两个文件(指定为旧文件和新文件),并生成一个补丁文件,该文件可用于升级旧文件,使其内容与新文件相同

实现速度必须相对较快,并且需要处理大量文件。它应该展示O(n)或O(logn)运行时

我自己的算法要么很糟糕(速度快,但生成的补丁很大),要么很慢(生成的补丁很小,但运行时间为O(n^2))

任何关于实现的建议或指针都很好

具体来说,该实现将用于使服务器与我们有一个主服务器的各种大型数据文件保持同步。当主服务器数据文件更改时,我们还需要更新几个非现场服务器

我所做的最简单的算法(仅适用于可以保存在内存中的文件)如下所示:

  • 从旧文件中获取前四个字节,称之为密钥
  • 将这些字节添加到字典中,其中key->position,where position是我抓取这4个字节的位置,从0开始
  • 跳过这四个字节中的第一个,抓取另外4个(3个重叠,1个),然后以相同的方式添加到字典中
  • 对旧文件中的所有4字节块重复步骤1-3
  • 从新文件开始,抓取4个字节,并尝试在字典中查找它
  • 如果找到,则通过比较两个文件中的字节来查找最长的匹配(如果有多个)
  • 在旧文件中对该位置的引用进行编码,并在新文件中跳过匹配的块
  • 如果未找到,请从新文件中编码1个字节,然后跳过它
  • 对新文件的其余部分重复步骤5-8
  • 这有点像压缩,没有窗口,因此会占用大量内存。但是,它相当快,并且生成相当小的补丁,只要我尝试使代码输出最小化

    内存效率更高的算法使用窗口,但会生成更大的补丁文件

    我在这篇文章中跳过了以上算法的更多细微差别,但如果必要,我可以发布更多细节。然而,我确实觉得我需要一个完全不同的算法,所以对上述算法的改进可能还不够


    编辑#1:下面是对上述算法的更详细描述

    首先,合并这两个文件,这样就有了一个大文件。记住两个文件之间的切点

    其次,抓取4个字节并将它们的位置添加到整个文件中所有内容的字典步骤中

    第三,从新文件的起始位置开始,循环尝试定位现有的4个字节的组合,并找到最长的匹配。确保我们只考虑旧文件中的位置,或者从新文件中的位置考虑当前的位置。这确保了我们可以在修补程序应用期间重用旧文件和新文件中的材料


    编辑#2

    您可能会收到有关证书存在某些问题的警告。我不知道如何解决这个问题,所以暂时只接受证书

    源代码使用了我库其余部分中的许多其他类型,因此文件不是它所需要的全部,但这就是算法实现


    @lomaxx,我试图为subversion中使用的算法找到一个很好的文档,称为xdelta,但是除非您已经知道该算法是如何工作的,否则我找到的文档无法告诉我需要知道什么

    或者也许我只是很笨……:)

    我从你提供的网站上快速浏览了一下算法,不幸的是它不可用。二进制diff文件中的注释表示:

    找到一组最佳的差异需要相对于输入大小的二次时间,因此它很快就变得不可用

    但我的需求并不是最优的,所以我正在寻找一个更实际的解决方案

    谢谢你的回答,如果我需要的话,他会在他的工具中添加书签

    编辑#1:注意,我会查看他的代码,看看是否能找到一些想法,稍后我还会给他发送一封电子邮件,提出问题,但我已经阅读了他参考的那本书,虽然该解决方案有助于找到最佳解决方案,但由于时间要求,它在使用中并不实用


    编辑#2:我一定会找到python xdelta实现。

    也许值得看看其他人在这个领域做了什么,而不一定是在C#领域


    SVN还有一个二进制diff算法,我知道python中有一个实现,尽管我无法通过快速搜索找到它。他们可能会给你一些关于改进你自己算法的想法

    对不起,我帮不了你什么忙。我肯定会继续关注xdelta,因为我已经多次使用它在我们为分发产品而生成的600MB+ISO文件上生成质量差异,并且它的性能非常好。

    如果这是为了安装或分发,您是否考虑过使用Windows Installer SDK?它能够修补二进制文件


    你看到了吗?它是看起来相当活跃的Misc库的一部分(最新版本R2592008年4月23日)。我没有使用它,但认为它值得一提。

    这是一个粗略的指南,但以下是rsync算法,可以用于创建二进制补丁

    设计用于为二进制文件创建非常小的修补程序。如页面所述,它需要
    max(17*n,9*n+m)+O(1)
    字节的内存,并以
    O((n+m)log n)
    时间运行(其中
    n
    是旧文件的大小,
    m
    是新文件的大小)

    最初的实现是用C语言实现的,但是描述了一个C#端口,并且该端口可用。

    SVN使用xde