Поменять местами биты в Linux

Это довольно просто. Вам необходимо создать пакет .rpm из последнего файла .tar.gz (в нашем случае stunnel 5.40). Вам понадобится инструмент rpmbuild, а также установленные компиляторы и прочее.

1) yum -y install glibc-devel kernel-headers kernel-devel gcc gcc-c++ autoconf automake make
2) yum -y install rpm-build
3) wget https://www.stunnel.org/downloads/stunnel-5.40.tar.gz

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

4) touch stunnel.logrotate; touch stunnel.init
5) ln -s /usr/share/doc/stunnel-4.29 /usr/share/doc/stunnel
6) rpmbuild -ta stunnel-5.40.tar.gz
7) rpm -Uhv /root/rpmbuild/RPMS/x86_64/stunnel*

В случае сбоя rpmbuild вы можете сделать следующее:

cd /root/rpmbuild/BUILD/stunnel-5.40/
make
make install

Выпустить stunnel -version в конце, чтобы убедиться, что у вас установлена ​​и работает последняя версия stunnel, как в моем случае:

root@zira /root/rpmbuild/BUILD/stunnel-5.40 (33 entries, 1 hidden)
56/23483# stunnel -version
stunnel 5.40 on x86_64-redhat-linux-gnu platform
Compiled/running with OpenSSL 1.0.1e-fips 11 Feb 2013
1
04.03.2017, 01:16
2 ответа

Как уже отмечалось, оболочка, вероятно, не лучшее место для этого. Если вы действительно хотите, вот решение с использованием awk , dc , printf , sed и tr :

#!/bin/sh
# file: swap-bits

target_order='D5679123C4EF80AB'
indices() {
    printf '%s\n' "$1"         \
    | sed 's/./\0 1+p\n/g'     \
    | sed '1s/^/10o16i/'       \
    | dc                       \
    | sed 's/^/substr( $0, /'  \
    | sed 's/$/, 1 )/'         \
    | tr '\n' ' '
    echo
}

sed 's/^/2o16iF/'                                              \
| sed 's/$/p/'                                                 \
| dc                                                           \
| sed 's/....//'                                               \
| awk "{ print \"16o2i\" $(indices ${target_order}) \"pq\" }"  \
| dc                                                           \
| sed 's/^/0000/'                                              \
| sed 's/.*\(....\)$/\1/'

Это не проверяет ввод. Переменная target_order должна быть установлена ​​на предпочтительную перестановку ваших 16 бит.

Функция index принимает в качестве входных данных такую ​​строку и выводит последовательность команд substr ($ 0, n, 1) , которые awk будет использовать чтобы переставить его ввод.

Основная часть скрипта начинается с использования dc для преобразования ввода из шестнадцатеричного в двоичный. Начальные нулевые биты сохраняются путем добавления к входу префикса F и отбрасывания четырех однобитовых. Результат передается в awk , который печатает команду, которая сообщает dc преобразовать двоичный код в шестнадцатеричный, затем переставленный вывод, затем команду, которая сообщает dc напечатать и выйти. Это, конечно, подается на постоянного тока . Наконец, снова используется sed , чтобы убедиться, что в выходных данных присутствуют ведущие нули, если это необходимо.

Вход поступает на стандартный ввод , вывод - на стандартный вывод , например:

$ echo B455 | ./swap-bits
CB15
1
27.01.2020, 23:46
perl -wMstrict -le '
   my @bits = unpack "(A1)16", sprintf "%016b", hex shift;
   my $bitmap = "D5679123C4EF80AB";
   @bits = @bits[ map { hex } split //, $bitmap ];
   $"="";
   print sprintf "%04X", oct "0b@bits";
' "B455"

Результат: CB15

Краткое:

First we convert the input hex number into it's 16-bit binary equivalent and store the indi-
dual bits in the array @bits. The individual bits are now mapped according to the bitmap wh-
ich is generated by splitting into single bits and getting their decimal equivalents which
are the array indices of @bits. Last step involves in converting the mapped bits into their
4-digit hex counterpart.
0
27.01.2020, 23:46

Теги

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