Преобразование из двоичного в шестнадцатеричный и обратно

С какой целью?

Предположительно вы хотите предпринимать какие-то действия, если он запущен, и, возможно, останавливаться, когда заставка заканчивается.

Я решил первую проблему на своей машине с помощью xautolock.

7
20.03.2017, 11:36
3 ответа

Возможно, ваш busybox был построен с помощью апплета base64 , поэтому вы могли бы сделать

busybox base64 <bin >txt
busybox base64 -d <txt >bin

А если нет, то у вас может быть почтенный uuencode и uudecode , которые также могут иметь параметр -m для кодирования в шестнадцатеричном формате. Например,

echo -n abcABC | busybox uuencode -m - | busybox uudecode - 

Перечислите встроенные апплеты с помощью busybox --list .

2
27.01.2020, 20:15

POSIXly (и только с использованием общего подмножества, совместимого с busybox (или, по крайней мере, busybox , созданным для текущего пакета Debian busybox ):

  • bin2hex :

     (
    экспорт LC_ALL = C 
    od -An -vtx1 | 
    tr -s '\ t \ n' '\ n \ n \ n '| 
    grep. 
    ) 
     

    (одно шестнадцатеричное значение в строке)

  • hex2bin :

     (
    экспорт LC_ALL = C 
    awk '
    НАЧАТЬ {
    for (i = 0; i <256; i ++) 
    c [sprintf ("% 02x", i)] = sprintf ("% o", i) 
    } 
    NR% 200 == 1 {printf "% s", end "printf '\' '"; end = "' \ '' \ n "} 
     {printf" \\% s ", c [$ 0]} 
    END {print end} '| 
    sh 
    ) {{1} } 

Если ваш busybox , в отличие от Debian, был построен без опции DESKTOP , то -An и -tx1 ] для od будет недоступен. Вместо этого можно использовать od -b , который даст однобайтный восьмеричный дамп с восьмеричным смещением. od -b ] - это Unix, но не POSIX, поэтому не будет работать во всех Unix-подобных системах.

bin2hex будет выглядеть так:

(
  export LC_ALL=C
    od -b |
    awk '
      BEGIN{
        for(i = 0; i < 256; i++)
          hex[sprintf("%03o", i)] = sprintf("%02x", i)
      }
      NF > 1 {for (i = 2; i<= NF; i++) print hex[$i]}'
)

Опять же, тестировался только с Busybox Debian, я не могу сказать, насколько это зависит от какой-то опции времени компиляции busybox или другого. Вам нужно будет протестировать целевую систему.

4
27.01.2020, 20:15

Вот что я придумал (на основе нескольких онлайн-источников и некоторых экспериментов).

Преобразование из шестнадцатеричного в битовое ( hex2bin ):

#!/bin/sh
sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' "$1" | xargs printf

Преобразование из шестнадцатеричного в шестнадцатеричное ( bin2hex ):

#!/bin/sh
hexdump -C "$1" | cut -b9- | cut -d"|" -f1 | tr -d ' \t\n\r'

Пример использования:

./bin2hex binary_file_1 | ./hex2bin - > binary_file_2
diff -s binary_file_1 binary_file_2

Это работает с busybox, но hex2bin, к сожалению, ограничен максимальной длиной аргумента xargs , поэтому этот метод будет работать только для небольших файлов (менее 32 КиБ в моей настольной системе).

13
27.01.2020, 20:15

Теги

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