Как вычислить контрольную сумму CRC в R, совместимую с выводом с помощью команды Linux `cksum`

Я загружаю файлы с сайта, который предоставляет контрольные суммы (в виде десятичных знаков), вычисленные с помощью команды Linux cksum.

В R я могу выполнить контрольную сумму CRC-32 в десятичном формате с помощью:

library(digest)
strtoi(digest(file_path, algo="crc32", file=TRUE), base=16L)

Есть ли похожая команда, которую я могу использовать для получения контрольной суммы для файла, совместимого с командой Linux cksum? Мне нужен кросс-платформенный подход, который предпочтительно не требует программного обеспечения, внешнего по отношению к R. страница википедии на cksum утверждает, что:

«Стандартная команда cksum, используемая в большинстве UNIX-подобных ОС (включая GNU/Linux, *BSD, Mac OS X и Solaris), использует алгоритм CRC, основанный на стандартной проверке кадра Ethernet, и поэтому может взаимодействовать между реализациями. однако не совместим с расчетом CRC-32».

Я также нашел cksum в пакете bitops, но мне непонятно, как лучше вычислить контрольную сумму для файла с помощью этой функции.


person Alex Zvoleff    schedule 04.02.2014    source источник
comment
Исходный код: git. savannah.gnu.org/gitweb/?p=coreutils.git;a=blob;f=src/, если вы хотите изучить алгоритм. Или оберните этот код в Rcpp...   -  person Spacedman    schedule 04.02.2014
comment
Или отправьте нам запрос на исправление/вытягивание пакета дайджеста.   -  person Dirk Eddelbuettel    schedule 04.02.2014
comment
Спасибо @Дирк. Это похоже на хороший вариант для быстрого CRC, совместимого с cksum Linux. Предположим, вы могли бы принять модифицированную версию кода GPL-3, на которую ссылается Spacedman?   -  person Alex Zvoleff    schedule 04.02.2014
comment
Пакет дайджеста находится под лицензией GPL-2. Я не лицензированный юрист, но, как вы и просили, я считаю, что это означает, что я не могу смешивать. Не знаю.   -  person Dirk Eddelbuettel    schedule 04.02.2014


Ответы (1)


Получите размер файла, прочитайте в необработанный вектор, преобразуйте в char, используйте cksum bitops:

cksumfile = function(f){
   size = file.info(f)$size
   c = file(f,"rb")
   csum = cksum(rawToChar(readBin(c,raw(),n=size)))
   close(c)
   csum
}

тест:

> cksumfile("/etc/passwd")
[1] 1594741334
> system("cksum /etc/passwd")
1594741334 1953 /etc/passwd

Эта отредактированная версия явно открывает и закрывает соединение, чтобы остановить предупреждение.

person Spacedman    schedule 04.02.2014
comment
Это не работает для произвольных двоичных файлов. Например, cksumfile("/bin/bash") возвращает Error in rawToChar(readBin(c, raw(), n = size)) : embedded nul in string - person Alex Zvoleff; 04.02.2014
comment
Фу. Да, символ не может хранить нули, а cksum использует символ, поэтому cksum может работать только с тем, что не имеет нулей. Предложите взломать код C битопов для чтения необработанных векторов. Извиняюсь! - person Spacedman; 04.02.2014