vcdiff - 关于RFC3284-VCDIFF格式的说明

标签 vcdiff

我是新尝试阅读此类文档的,我对 VCDIFF 的指令如何工作感到困惑,这是原始文档:

https://www.rfc-editor.org/rfc/rfc3284

这部分:

  ADD:  This instruction has two arguments, a size x and a sequence
        of x bytes to be copied.
  COPY: This instruction has two arguments, a size x and an address
        p in the string U.  The arguments specify the substring of U
        that must be copied.  We shall assert that such a substring
        must be entirely contained in either S or T.
  RUN:  This instruction has two arguments, a size x and a byte b,
        that will be repeated x times.

现在文档举了一个例子:

     a b c d e f g h i j k l m n o p
     a b c d w x y z e f g h e f g h e f g h e f g h z z z z

     COPY  4, 0
     ADD   4, w x y z
     COPY  4, 4
     COPY 12, 24
     RUN   4, z

我不明白每个操作都做了什么,我认为第一个副本是第一个“a b c d”,添加现在包括“w x y z”,现在我不太明白接下来的两个副本是如何工作的。

如果我认为如果有人可以展示该指令的作用会很有用,例如“这条指令有这个字符串作为结果,下一个是这个”,只是为了可以逐步比较:D

谢谢。

最佳答案

看起来在执行此操作时您将知道输出的长度。在这种“语言”中,输入和输出在“内存”中是连续的。所以你开始:

abcdefghijklmnop----------------------------
|<-     S    ->||<-            T         ->|

第一个 COPY 4 个字节,从组合字符串中的偏移量 0 开始:

ABCDefghijklmnopABCD------------------------
|<-     S    ->||<-            T         ->|

然后ADD 4个字节,字面意思是w x y z:

abcdefghijklmnopabcdWXYZ--------------------
|<-     S    ->||<-            T         ->|

然后COPY从偏移量4开始的4个字节:

abcdEFGHijklmnopabcdwxyzEFGH----------------
|<-     S    ->||<-            T         ->|

然后COPY从偏移量24开始的12个字节。这有点棘手,因为偏移量24是我们刚刚写入的“efgh”,而且我们还没有写入最后8个字节,但是如果您一次执行一个字节,重叠并不重要:

                        |<- from ->|
                            |<-  to  ->|
abcdEFGHijklmnopabcdwxyzefghEFGHEFGHEFGH----
|<-     S    ->||<-            T         ->|

最后有一个由 4 个连续字节组成的 RUN,全部为“z”:

abcdEFGHijklmnopabcdwxyzefghefghefghefghZZZZ
|<-     S    ->||<-            T         ->|

关于vcdiff - 关于RFC3284-VCDIFF格式的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51451553/

相关文章:

git - git binary diff算法(增量存储)是否标准化?

emacs - 如何使 vc-diff 输出更紧凑

c++ - 使用 xdelta : header file not found. c++