Unix-скрипт для преобразования неподписанного int32 в байты с прямым порядком байтов и записи в файл - PullRequest
0 голосов
/ 10 апреля 2019

Я хочу написать скрипт (bash / awk / gawk / любой другой стандартный скрипт) на машине с Unix, у которой в качестве аргумента программы есть целое число без знака, затем он преобразует его в байты с прямым порядком байтов и записывает байты в новый файл.

Примерно так: ./writebytes 5 outputfile.txt где 5 - это значение, которое я хочу записать в outputfile.txt в байтах после преобразования в обратный порядок байтов

сейчас, если я сделаю hexdump outputfile.txt вывод должен выглядеть как

0000000 0005 0000
0000004

Я очень новичок в Unix и скриптах. Затем я хочу иметь возможность выводить содержимое файла outputfile.txt в простом десятичном формате, читаемом человеком.

./readbytes outputfile.txt

и вывод 5

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Превращение ascii-представления целого числа в двоичное 32-разрядное целое число с прямым порядком байтов легко с помощью perl, как уже отмечалось, а сохранение этого значения в файл - простое перенаправление оболочки:

$ num=5
$ perl -e "print pack('N', $num)" > outputfile.txt
$ xxd outputfile.txt
00000000: 0000 0005

Примечания:

  • Замена переменной $num в данном примере выполняется оболочкой, а не самим perl.
  • pack("N", value) - это способ perl для преобразования value в32-разрядное целое число с прямым порядком байтов.

Для полноты, версия с прямым порядком байтов:

$ perl -e 'print pack("V", 5)' | xxd
00000000: 0500 0000

Чтение из файла немного сложнее, посколькуэто двоичные данные, а не строковый текст.Вы должны прочитать все 4 байта файла одновременно, независимо от того, что они есть.К счастью, Perl также делает это легко:

$ perl -0777 -nE 'say unpack("N", $_)' outputfile.txt
5

Аргумент -0777 - это идиоматический способ чтения всего файла за один раз в сочетании с -n, который читает файлы или стандартный ввод, вызывая остальную частьскрипт (предоставляется -E) для каждого чанка (обычно это строка, но весь файл в этом случае)

0 голосов
/ 10 апреля 2019

Это может быть сделано с помощью Perl однострочного, я думаю, что вы ищете что-то вроде ниже

$ hexdump <(perl -e ' $x=pack("I",5) ; print $x ')
0000000 0005 0000
0000004

если вы хотите получить в качестве параметра

$ data=5
$ perl -ne ' $x=pack("I",$_) ; print $x '  <<< "$data" > outfile.txt

$ hexdump outfile.txt
0000000 0005 0000
0000004

$ wc outfile.txt
0 0 4 outfile.txt

Чтобы прочитать обратно файл outfile.txt, снова вы можете использовать Perl

$ perl -ne ' $a=unpack("I",$_); print $a ' outfile.txt
5
...