Объяснение о 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         ->|
Другие вопросы по тегам