Как перебрать символ в строке и все еще обнаружить нулевой символ в Bash - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть эта функция:

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.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Чтобы получить все символы строки в виде десятичного числа, вы можете использовать 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 объяснение:

  • options -v и --no-squeezing печатает все байты (без пропуска дублированных байтов)
  • параметры -e и --format позволяют задать определенный формат
  • формат 1/1 "%d ", что означает
    • Счетчик итераций = 1 (обрабатывает байт только один раз)
    • Количество байтов = 1 (применить этот формат для каждого байта)
    • Формат = "%d" (преобразовать в десятичную)
0 голосов
/ 13 ноября 2018

Нельзя сохранить нулевой символ в переменной bash, что происходит в вашем сценарии с переменной $char.

Я предлагаю использовать xxd вместо написания собственного сценария:

echo -ne "some ascii text" | xxd -p

Если мы повторим нулевой символ:

$ echo -ne "\0" | xxd -p
00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...