Как перебрать символ в строке и по-прежнему обнаруживать нулевой символ в Bash

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

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.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
124
2

Ответы 2

Вы не можете сохранить нулевой символ в переменной bash, что происходит в вашем скрипте с переменной $char.

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

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

Если мы выводим нулевой символ:

$ echo -ne "\0" | xxd -p
00

также проблема в том, что если нет stdout, он все равно читает его как нулевой символ. Можно ли определить, был ли стандартный вывод? или отсутствие stdout представлено нулевым значением?

Daily Memes 13.11.2018 18:29

@DailyMemes Я не понимаю вашего вопроса о том, что происходит «если нет стандартного вывода». В этом случае я получаю ничего такого, а не ноль. Попробуйте cat /dev/null | xxd -p - у меня вообще нет вывода. То же самое с ответом @oliv hexdump, BTW.

Gordon Davisson 13.11.2018 19:36

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

Daily Memes 13.11.2018 18:10

@DailyMemes Я обновил ответ, используя короткий (вместо длинного) вариант.

oliv 13.11.2018 18:35

@olive .. не могли бы вы добавить объяснение

stack0114106 14.11.2018 07:50

параметры -v-e и формат 1/1 .. почему именно 1/1

stack0114106 14.11.2018 09:44

а в конце стоит 10? Я не хочу 10

Daily Memes 16.11.2018 16:52

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