Следующее решение основано только на xxd
(один из инструментов, упомянутых в вопросе), Bash и GNU sed.
Предполагается, что ввод состоит из полных байтов (групп из восьми букв), произвольно разделенных символами новой строки.
Подход таков:
Удалите все символы новой строки.
Сгруппируйте буквы в группы из четырех букв, оканчивающиеся пробелами.
Отфильтруйте эти квадграфы в шестнадцатеричные цифры, не отделенные друг от друга.
Сгруппируйте пары шестнадцатеричных цифр вместе, каждая пара в отдельной строке.
Прочтите эти байтовые значения с помощью цикла оболочки и восстановите xxd
совместимый шестнадцатеричный дамп.
Перенаправить в xxd -r
для преобразования дампа в шестнадцатеричные данные.
Код:
#!/bin/bash
addr=0
tr -d '\n' | \
sed -e 's/..../& /g' |
sed -e 's/AAAA /0/g' \
-e 's/AAAB /1/g' \
-e 's/AABA /2/g' \
-e 's/AABB /3/g' \
-e 's/ABAA /4/g' \
-e 's/ABAB /5/g' \
-e 's/ABBA /6/g' \
-e 's/ABBB /7/g' \
-e 's/BAAA /8/g' \
-e 's/BAAB /9/g' \
-e 's/BABA /A/g' \
-e 's/BABB /B/g' \
-e 's/BBAA /C/g' \
-e 's/BBAB /D/g' \
-e 's/BBBA /E/g' \
-e 's/BBBB /F/g' |
sed -e 's/../&\n/g' |
while read hexbyte ; do
if [ $((addr % 16)) == 0 ] ; then
printf "%08x: " $addr
fi
printf "%s" $hexbyte
if [ $((addr % 16)) == 15 ] ; then
printf "\n"
else
printf " "
fi
: $(( addr++ ))
done |
xxd -r - -
Скромный прогон образца:
$ cat data
AAAABBB
B
ABABABAB
ABABAABBBBAABBAB
$ ./ab.sh < data > data.bin
$ xxd data.bin
0000000: 0f55 53cd .US.
Вот модификация кода для обработки конечной группы из семи или менее битов, путем дополнения ее нулями, чтобы получился полный байт, так что, например, файл не содержащий ничего, кроме B
, отображается в байт 0x80
:
#!/bin/bash
addr=0
tr -d '\n' | \
sed -e 's/..../& /g' |
sed -e 's/AAAA /0/g' \
-e 's/AAAB /1/g' \
-e 's/AABA /2/g' \
-e 's/AABB /3/g' \
-e 's/ABAA /4/g' \
-e 's/ABAB /5/g' \
-e 's/ABBA /6/g' \
-e 's/ABBB /7/g' \
-e 's/BAAA /8/g' \
-e 's/BAAB /9/g' \
-e 's/BABA /A/g' \
-e 's/BABB /B/g' \
-e 's/BBAA /C/g' \
-e 's/BBAB /D/g' \
-e 's/BBBA /E/g' \
-e 's/BBBB /F/g' \
-e 's/AAA$/0/g' \
-e 's/AAB$/2/g' \
-e 's/ABA$/4/g' \
-e 's/ABB$/6/g' \
-e 's/BAA$/8/g' \
-e 's/BAB$/A/g' \
-e 's/BBA$/C/g' \
-e 's/BBB$/E/g' \
-e 's/AA$/0/g' \
-e 's/AB$/4/g' \
-e 's/BA$/8/g' \
-e 's/BB$/C/g' \
-e 's/A$/0/g' \
-e 's/B$/8/g' |
sed -e 's/../&\n/g' |
sed -e 's/^.$/&0\n/' |
while read hexbyte ; do
if [ $((addr % 16)) == 0 ] ; then
printf "%08x: " $addr
fi
printf "%s" $hexbyte
if [ $((addr % 16)) == 15 ] ; then
printf "\n"
else
printf " "
fi
: $(( addr++ ))
done |
xxd -r - -
прокомментируйте следующую строку в/etc/snmp/snmp.conf
mibs +ALL
И добавьте следующую строку.
mibs +SNMPv2-MIB
Наконец, перезапустите службу
service snmpd restart