Как преобразовать неподписанное десятичное число (меньше чем 1 <<32) к 4 байтам (двоичный файл) в ударе?

В основном необходимо удостовериться, что Вы используете недавнюю версию John, которой включили поддержку OpenMP.

При компиляции его сами, необходимо явно включить поддержку OpenMP в make-файле (и проверить, что необходимые зависимости доступны - например, GCC> = 4.2).

Поддержка OpenMP не обязательно доступна для всех методов хеша, и общественный выпуск (-гигант) поддерживает больше, чем официальный.

С получающимся двоичным файлом можно проверить, имеет ли он OpenMP через вызов ldd на нем - он должен отобразить некоторые связанные с членом парламента библиотеки. Также можно указать через переменную среды OMP_NUM_THREADS количество ядер, которые программа OpenMP должна использовать - если это сброшено значение по умолчанию (на Linux) должно быть: все ядра.

См. также примечания по OpenMP в Wiki John's.

4
30.09.2014, 14:28
3 ответа

Вы можете использовать Perl :

$ perl -e 'print pack "I>", shift' $(( RANDOM << 17 | RANDOM << 2 | RANDOM >> 13 ))
2
27.01.2020, 20:52

dc может принимать произвольный входной радиус и выходной сигнал на одинаково произвольном выходном радиусе. Вы связываетесь с dc, передавая ему сначала значение (или строку значений, разделенных пробелом), а затем команду на обработку значения. По умолчанию dc устанавливает базовый 10 радикс как для входа, так и для выхода.

Например, для преобразования произвольных десятичных значений в двоичные (или, как минимум, в базовые 2):

printf 2o%dp "'A" | dc
1000001

Это работает со следующим списком команд для dc:

  1. добавить 2 к вершине основного стека

  2. вывести верхнее значение из основного стека и использовать его значение в качестве output radix

  3. добавить 65 (десятичное значение ASCII в пересчете на printf в моей локали) к вершине Основной стек

  4. выведет верхнее значение из основного стека и p выведет его значение в stdout в базу, которая в настоящее время указана как выходной радиус

dc, также выведет значения ASCII для байтов, интерпретируемые его входным радиусом:

printf 8i%oP "'A" | dc
A

. ...и ...

printf 2i%sP 1000001 | dc
A

Процесс во многом такой же, как и раньше, за исключением того, что i используется для задания i выходного радикса в отличие от предыдущего oвыходного радикса и что P используется для интерпретации значения верхнего стека в качестве символа ASCII на выходе.

bc может делать многое из того же самого, хотя он имеет тенденцию к гораздо более многословному синтаксису. Однако man dc и man bc для более. битовых сдвигов нет ни в одном из репертуаров программы. Тем не менее, как вы показали, любой POSIX-оболочка может довольно легко справиться с этим с помощью арифметического расширения.

1
27.01.2020, 20:52

Вы можете использовать встроенную функцию printf для выдачи байтов, заданных восьмеричными кодами.

x=1193046
printf "$(printf "\\%03o" $((x>>24&255)) $((x>>16&255)) $((x>>8&255)) $((x&255)))"
3
27.01.2020, 20:52

Теги

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