У меня есть такая функция:
function convert_ascii_string_to_decimal {
ascii=$1
unset converted_result
while IFS = "" read -r -n 1 char; do
decimal=$(printf '%d' "'$char")
echo $decimal
converted_result = "$converted_result $decimal"
done < <(printf %s "$ascii")
converted_result=$(echo $converted_result | xargs) #strip leading and trailing
}
Он предназначен для того, чтобы принимать строковую переменную ascii, перебирать каждый символ и объединять десятичное представление ascii со строкой. Однако этот цикл while, кажется, игнорирует нулевые символы, то есть символы с ascii 0. Я хочу иметь возможность читать все существующие ascii, включая null.





Вы не можете сохранить нулевой символ в переменной bash, что происходит в вашем скрипте с переменной $char.
Я предлагаю использовать xxd вместо написания собственного скрипта:
echo -ne "some ascii text" | xxd -p
Если мы выводим нулевой символ:
$ echo -ne "\0" | xxd -p
00
@DailyMemes Я не понимаю вашего вопроса о том, что происходит «если нет стандартного вывода». В этом случае я получаю ничего такого, а не ноль. Попробуйте cat /dev/null | xxd -p - у меня вообще нет вывода. То же самое с ответом @oliv hexdump, BTW.
Чтобы получить все символы строки как десятичное число, вы можете использовать hexdump для анализа строки:
echo -e "hello \x00world" | hexdump -v -e '1/1 "%d "'
104 101 108 108 111 32 0 119 111 114 108 100 10
Это также работает для синтаксического анализа файла:
echo '05 04 03 02 01 00 ff' | xxd -r -ps > file
hexdump --no-squeezing --format '1/1 "%d "' file
5 4 3 2 1 0 255
hexdump объяснение:
-v и --no-squeezing распечатывают все байты (без пропуска повторяющихся байтов)-e и --format позволяют указать конкретный формат1/1 "%d ", что означает
1 (обрабатывать байт только один раз)1 (примените этот формат для каждого байта)"%d" (преобразовать в десятичное)ваше первое решение дает следующую ошибку: hexdump: неверный параметр - - использование: hexdump [-bcCdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...] hd [- bcdovx] [-e fmt] [-f fmt_file] [-n длина] [-s пропустить] [файл ...]
@DailyMemes Я обновил ответ, используя короткий (вместо длинного) вариант.
@olive .. не могли бы вы добавить объяснение
параметры -v-e и формат 1/1 .. почему именно 1/1
а в конце стоит 10? Я не хочу 10
также проблема в том, что если нет stdout, он все равно читает его как нулевой символ. Можно ли определить, был ли стандартный вывод? или отсутствие stdout представлено нулевым значением?