xxd -r без xxd

Я использую уменьшенную версию CentOS 5.5 без множества доступных инструментов. Нет xxd, bc или hd. Я не могу установить дополнительные утилиты, к сожалению. У меня есть od, dd, awk и bourne shell (не bash). То, что я пытаюсь сделать, относительно просто в обычной среде. По сути, у меня есть число, скажем, 100 000, и мне нужно сохранить его двоичное представление в файле. Как правило, я бы сделал что-то вроде...

printf '%x' "100000" | xxd -r -p > file.bin

Если вы просмотрите шестнадцатеричный дамп файла, вы правильно увидите число, представленное как 186A0.

Есть ли эквивалент, который я могу объединить, используя ограниченные инструменты, которые у меня есть? Почти все, что я пробовал, хранит значения ascii для цифр.

1 ответ

Решение

Вы можете сделать это с помощью комбинации вашего printf, awk и вашей оболочки.

#!/usr/bin/env awk
# ascii_to_bin.awk
{
    # Pad out the incoming integer to a full byte
    len = length($0);
    if ( (len % 2) != 0) {
        str = sprintf("0%s", $0);
        len = len + 1;
    }
    else {
        str = $0;
    }
    # Create your escaped echo string
    printf("echo -n -e \"");
    for(i=1;i<=len;i=i+2) {
        printf("\\\\x%s", substr(str, i, 2));
    }
    printf("\"");
}

Тогда вы можете просто сделать

$ printf '%x' "100000" | awk -f ascii_to_bin.awk | /bin/sh > output.bin

Если вы знаете целевую длину двоичного файла, вы можете просто сделать printf "%0nX" (n целевой размер) и удалите (len % 2) логика.

Другие вопросы по тегам