我是新尝试阅读此类文档的,我对 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/