Какой алгоритм контрольной суммы используется в версии 5 Unix?

Una cosa son los programas instalados, otra muy distinta es la configuración personal que utiliza tu entorno. Tendrás que averiguar cómo agregarlo allí.

¿Qué escritorio estás usando?

4
02.07.2019, 11:19
1 ответ

At first, I thought that it is a simple sum of bytes modulus 2^16

Это сумма по модулю 2^16, только каждый раз, когда она переполняется, к ней добавляется 1. Кроме того, байты будут расширены по знаку перед добавлением к сумме. Вот «закомментированный» фрагмент сборки:

# r2 is the pointer into the data
# r0 is the length of the data
# r5 is the sum
2:
        movb    (r2)+,r4    # r4 = sign_extend(*r2++)
        add     r4,r5       # r5 += r4
        adc     r5          # if(r5 overflowed) r5++
        sob     r0,2b       # if(--r0) goto 2 above

то же самое поместите в небольшую программу на C (используйте как./v5sum < file):

#include <stdio.h>
int main(void){
        int c, s = 0;
        while((c = getchar()) != EOF){
                s += c & 0x80 ? c | 0xff00 : c; // alternative: s += (unsigned short)(signed char)c
                if(s & 0x10000){ s++; s &= 0xffff; };
        }
        printf("%d\n", s);
        return 0;
}

To be more specific, the cksum -o 2 and Unix V5's sum produce different output for most binary files in the emulator (for example, in folder /bin), though they agree on most text files.

Это потому, что исходный unix v5 sumбудет расширять знаки символов, и только двоичные файлы содержат байты >= 0x80. В противном случае алгоритмы должны быть похожими и отличаться только для очень больших файлов (, где сумма символов будет переполнять 32-битное целое число без знака ).

4
27.01.2020, 20:55

Теги

Похожие вопросы