Объяснение о RFC3284 - формат VCDIFF
Я новенький, пытаюсь прочитать документацию этого типа, и я запутался в том, как работает инструкция VCDIFF, это оригинальный документ:
https://tools.ietf.org/html/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
Спасибо.
1 ответ
Похоже, что в тот момент, когда вы выполняете это, вы будете знать длину вывода. На этом "языке" ввод и вывод последовательны в "памяти". Итак, вы начинаете с:
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
12 байтов, начиная со смещения 24. Это немного хитро, потому что смещение 24 - это "efgh", которое мы только что написали, и мы еще не записали последние 8 байтов, но если вы делаете это по одному байту за раз, перекрытие не ' не имеет значения:
|<- from ->|
|<- to ->|
abcdEFGHijklmnopabcdwxyzefghEFGHEFGHEFGH----
|<- S ->||<- T ->|
Наконец-то есть RUN
из 4 последовательных байтов все "z":
abcdEFGHijklmnopabcdwxyzefghefghefghefghZZZZ
|<- S ->||<- T ->|