Чтение двоичного файла в виде массива байтов или 16 или 32 бит с использованием сценария оболочки

Я работаю над основанной на ARM модемной Linux-машине, и мне нужно прочитать файл bin в виде 8-, 16- или 32-битного массива. Мне в основном нужно зашифровать рассматриваемый файл и думать только о XOR-битах со случайной последовательностью бит (мне не нужна очень сложная система). У хоста Linux нет модулей C или PERL, поэтому я не могу их использовать, и поэтому мне нужно сделать это с помощью сценария оболочки. Может ли кто-нибудь дать мне несколько указаний о том, как это сделать?

  • Извлечение запросов из файла журнала, которые не включают запрещенные строки
  • Как связывать линии между шаблоном начала и конца?
  • Как объединить все файлы в заданном каталоге по дате, где я хочу, чтобы самый новый файл был сверху?
  • Как установить переменную
  • Как избежать метасимволов оболочки с помощью команды `find`?
  • Как сделать обратный вывод, который уже передан из команд сортировки и вырезания
  • Передайте все строки в файле как отдельный аргумент, разделенный пробелом
  • Как построить длинную командную строку?
  • 3 Solutions collect form web for “Чтение двоичного файла в виде массива байтов или 16 или 32 бит с использованием сценария оболочки”

    Используйте tr (здесь rot128):

     LC_ALL=C tr '\0-\377' '\200-\377\0-\177' < infile > outfile 

    Для XOR 123 вам необходимо вычислить соответствующую строку tr :

     LC_ALL=C tr '\0-\377' '\173\172\171\170\177\176\175\174\163\162\161\160\167\166\165\164\153\152\151\150\157\156\155\154\143\142\141\140\147\146\145\144\133\132\131\130\137\136\135\134\123\122\121\120\127\126\125\124\113\112\111\110\117\116\115\114\103\102\101\100\107\106\105\104\73\72\71\70\77\76\75\74\63\62\61\60\67\66\65\64\53\52\51\50\57\56\55\54\43\42\41\40\47\46\45\44\33\32\31\30\37\36\35\34\23\22\21\20\27\26\25\24\13\12\11\10\17\16\15\14\3\2\1\0\7\6\5\4\373\372\371\370\377\376\375\374\363\362\361\360\367\366\365\364\353\352\351\350\357\356\355\354\343\342\341\340\347\346\345\344\333\332\331\330\337\336\335\334\323\322\321\320\327\326\325\324\313\312\311\310\317\316\315\314\303\302\301\300\307\306\305\304\273\272\271\270\277\276\275\274\263\262\261\260\267\266\265\264\253\252\251\250\257\256\255\254\243\242\241\240\247\246\245\244\233\232\231\230\237\236\235\234\223\222\221\220\227\226\225\224\213\212\211\210\217\216\215\214\203\202\201\200\207\206\205\204' 

    В более общем плане, чтобы ответить на вопрос, преобразовать файл в массив чисел, который будет использоваться оболочкой со стандартными командами:

     set -- $(od -An -vtu1 < infile) 

    Затем вы можете применить нужные преобразования и преобразовать обратно в файл с помощью awk 's printf("%c") .

    Это будет очень неэффективно.

    Подобно:

     for i in $(od -An -vtu1 < infile); do echo "$(($i ^ 123))" done | awk '{printf "%c", $0}' > outfile 

    Вы можете использовать od -An -vtu2 , чтобы получить 16-битные числа, но обратите внимание, что он находится в локальной endianness, поэтому при обращении к персонажам вы должны учитывать это.

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

    Если у вас есть xxd :

     xxd -b | awk '{ for(i=2 ; i<=NF-1 ; i++) { print $i } }' 

    Например:

     echo -n mayonnaise | xxd -b | awk '{ for(i=2 ; i<=NF-1 ; i++) { print $i } }' 
     01101101 01100001 01111001 01101111 01101110 01101110 01100001 01101001 01110011 01100101 

    Я использовал эту очень грубую функцию для xor двух 128-байтных файлов:

     one_time_pad() { asrc="$1" bsrc="$2" dst="$3" atmp="`mktemp`" btmp="`mktemp`" hexdump -v -e '1/1 "%02x" " "' "$asrc" > "$atmp" hexdump -v -e '1/1 "%02x" " "' "$bsrc" > "$btmp" rm "$dst" touch "$dst" for i in `seq 1 128` do a=`awk '{print $'$i';}' < "$atmp"` b=`awk '{print $'$i';}' < "$btmp"` echo -n -e '\x'`printf "%x" $((0x$a^0x$b))` >> "$dst" done } one_time_pad in1 in2 out 

    Производительность мудрая, это совершенно ужасно (это вызов awk дважды для каждого байта!). В моем случае производительность просто не была проблемой. Я уверен, что вы можете найти гораздо лучший способ.

    Interesting Posts

    Solaris: найдите день последнего понедельника, вторника, … воскресенье с помощью сценария оболочки

    Wget загружать файл (не перезаписывать) сценарий автоматического обновления

    Как удалить том bcache0?

    Почему новые версии ядра не могут решить проблему подсветки?

    Программа автозапуска в Xfce

    FreeNAS: несоответствие имени / имени хоста для smbd

    Как отслеживать время соединения ssh, время отключения и время простоя?

    Является ли он частью любого стандарта (например, POSIX), что системные файлы должны быть более строчными?

    используя скрипт bash для сортировки текста в файле

    yum Поврежденный файл repomd.xml

    Доступ к выделенному тексту из сценария?

    tar: исключить gzip-файл и не пытаться его уничтожить

    Как избежать отправки EOF из запроса на разбор скриптов и отправки ответов на netcat

    Назначение глобальных и локальных переменных

    Двойная загрузка Windows 7 и Arch Linux

    Linux и Unix - лучшая ОС в мире.