Преобразовать список десятичных значений в текстовом файле в формат Hex

Все файлы / dev / tty * являются специальными символьными файлами.

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

find /dev -type c -name 'tty*'

Или в zsh :

print -l /dev/tty*(%c)
2
22.07.2018, 08:28
6 ответов

Это можно сделать с помощью printfи bash:

.
printf '%08x\n' $(< test.txt)

Или с помощью printf и bc...просто...потому что?

printf '%08s\n' $(bc <<<"obase=16; $(< test.txt)")

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

printf '%08x\n' $(< test.txt) > output.txt
13
27.01.2020, 21:48

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

Для таких оболочек, как ksh, bash, zsh:

printf '%08x\n' $(<infile)

Только для bash

<file.txt mapfile -t arr;   printf '%08x\n' "${arr[@]}" 

Для более простых оболочек :тире (sh по умолчанию в системах на базе Debian ), ash (эмулированная оболочка busybox ), yash и некоторые оболочки по умолчанию в AIX и Solaris:

printf '%08x\n' $(cat infile)

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

$ printf '%08x\n' `cat infile`

Ответ на РЕДАКТИРОВАТЬ #1

Имейте в виду, что шестнадцатеричное значение 80000000вызовет переполнение на 32-битном компьютере (, что не является обычным явлением в наши дни, но возможно ).Убедитесь, что echo "$((0x80000000))"не печатает отрицательное значение.

$ for i in $(<infile); do printf '%08x\n' "$(($i+0x80000000))"; done
80020000
80030000
80040000
80050000
80060000
5
27.01.2020, 21:48

Использованиеawk:

$ awk '/[0-9]/ { printf("%08x\n", $0) }' file
00020000
00030000
00040000
00050000
00060000
5
27.01.2020, 21:48

Еще один -вкладыш. Все еще не python, но который допускает комментарии, пустые строки и все, что есть в файле, и выводит результат только для строк, содержащих только число.

perl -ne '/^(\d+)$/ && printf "%08x\n", $1'  $your_file

Учитывая такой файл:

$ cat $your_file
# some numbers,
131072
196608

262144
327680
393216

and empty lines
and whatever...

Он печатает

00020000
00030000
00040000
00050000
00060000
2
27.01.2020, 21:48

Вот несколько однострочных решений на PHP:

<?php
foreach (file('test.txt') as $s) echo dechex(+$s), "\n";
<?php
array_map(fn($s) => print dechex(+$s). "\n", file('test.txt'));
1
27.01.2020, 21:48

Использование Джулии

$ julia -e 'function hexadd(x) hex(( x + 0x80000000),8) end ; output = open("output.txt","w") ; open("test.txt") do inputfile for num in eachline(inputfile) write(output,"$(hexadd(parse(Int,num)))\n") end end'

Должно быть легче читать многострочные:

function hexadd(x)
    hex(( x + 0x80000000),8)
end
output = open("output.txt","w")
open("test.txt") do inputfile
    for num in eachline(inputfile)
        write(output,"$(hexadd(parse(Int,num)))\n")
    end
end
  • hex( value, pad)преобразует значение в шестнадцатеричный формат и при необходимости добавляет отступы.
    hexaddтребует ввода целого числа, поэтому мы преобразуем строки (выводаeachlineIntс помощью parse(Int,"string")и используем это в нашей функции.
  • julia -eоценивает выражение.
  • julia может быть установлена ​​изначально в Fedora, Ubuntu

Использование постоянного тока:

$ dc -f test.txt -e '16o16i[80000000+psaz1<r]dsrx80000000+p' > output.txt

Пояснение:

  • dc -f test.txt -e '16o 16i [80000000 + p sa z 1 <r] sr z 1 <r 80000000 + p' > output.txt
  • -f fileпоместить содержимое файла в стек
  • -eвыполнить выражение
  • 16oпреобразовать выходные данные в число 16 по основанию
  • 16iпредполагается ввод в базе 16. Это происходит после чтения файла, поэтому файл был прочитан в базе 10. Более явно я мог бы сделатьdc -e '10i' -f file -e '16 i 8000000'
  • [...]поместить строку в стек. Эта строка будет использоваться как макрос.
  • 80000000 +добавить текущую вершину стека и шестнадцатеричное число 80000000. Поместить результат на вершину стека.
  • pПечать текущей вершины стека без извлечения. Только опция печати, которая печатает новую строку.
  • saИзвлечение и сохранение вершины стека в регистре 'a'. Он никогда не используется, просто способ избавиться от верхней части мешка.
  • zТекущая вершина стека теперь имеет глубину стека. Требуется для завершения рекурсивного вызова.
  • 1поместить 1 на вершину стека. Полезно по сравнению с глубиной стека (z ), помещенной ранее.
  • <rсравнить 2 значения из стека, если второе меньше первого, выполнить регистр 'r'. По сути, сравните глубину стека и «1».
  • srизвлечь и сохранить в регистре 'r'. Теперь макрос находится в регистре 'r' и будет выполняться до тех пор, пока глубина стека больше 1. За исключением того, что его еще никто не вызывал.
  • dДублировать вершину стека и отправить.
  • xВыполнить вершину стека как макрос.
  • d sr xДублировать макрос и отправить, теперь стек имеет 2 копии, извлечь и сохранить верхнюю копию для регистрации, извлечь и выполнить 2-ю копию...
  • Итак, поместите глубину стека и 1, сравните и выполните, а для последнего элемента снова добавьте шестнадцатеричное значение и напечатайте.
1
27.01.2020, 21:48

Теги

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