Echo \x6e в оболочке, но вызывается из С++ с использованием переменной

Я пытаюсь вывести шестнадцатеричное значение, используя переменную для числа. Вот пример без var.

system("echo '\x6e'");
//output:
//n

Идеальный.

Но это не работает:

for (int i=1; i<7; i++) {
  system(("echo '\x"+to_string(i)+"e'").c_str());
}

//Which does not even compile. 
//compiler:
//error: \x used with no following hex digits

Что ж, если вы действительно позволите коду работать, там будут шестнадцатеричные цифры. Я пытаюсь \\x, но потом он буквально печатает \x1e и т.д.

В первом примере \x6e обрабатывается как один байт во время компиляции. Во втором примере конкатенация происходит во время выполнения, то есть намного позже факта интерпретации во время компиляции.

Eljay 18.02.2023 17:09
system((std::string("echo '") + char(i*16+0xe) + '\'').c_str()); . Я не знаю, что это должно делать, но это эквивалент первого вызова.
Igor Tandetnik 18.02.2023 17:12

Вы находитесь на языке, полностью способном манипулировать байтами. Вам не нужно полагаться на нотацию \x, которая удобна для людей.

tadman 18.02.2023 17:12

@Eljay Eljay Я думал, что он отправил оператор эха внутри system() за один раз. Возможно ли это? Чтобы подготовить всю строку system(), а затем запустить ее?

ED818 18.02.2023 17:13
'\x6e' буквально просто число 110 — 6e в шестнадцатеричном виде — как char. .
molbdnilo 18.02.2023 17:15

@tadman, твоя первая фраза вселяет в меня душевное спокойствие и надежду. Ваше второе предложение напоминает мне, что я ничего не знаю. Но я думаю, что вы дали мне некоторые идеи о том, что Google.

ED818 18.02.2023 17:16
\x## и другие управляющие последовательности обрабатываются очень рано в процессе компиляции при лексировании токенов (например, выясняется, что "\x24" является строковым литералом). Как только компилятор прочитает этот небольшой фрагмент кода как строковый литерал, ваша возможность использовать escape-последовательности исчезнет навсегда, за одним очень специфическим «исключением», которое здесь не имеет значения.
chris 18.02.2023 17:27

@IgorTandetnik Игорь, это работает, но вы говорите, что не знаете, почему я думаю, что вы проверили ресурс ... не могли бы вы связать меня с этим ресурсом? :)

ED818 18.02.2023 17:31

@Крис очень крутой. Могу ли я заставить конкатенацию переменных целиком читаться как строковый литерал? Как a+b+c+d, где каждая переменная была \x6e соответственно.

ED818 18.02.2023 17:35

@ ED818, Почти, как только каждая строка имеет свой окончательный набор символов (на самом деле байтов), вы можете манипулировать ими по своему усмотрению. Результат не может быть строковым литералом, если только каждая часть не является строковым литералом, но это может быть что-то, что работает в тех же местах, что и строковый литерал, например, как в ответе.

chris 18.02.2023 17:47

@chris bah вы, ребята, такие крутые. Я учился на этом более десяти лет, и это первый раз, когда мне пришлось самому задавать вопрос. Ваше здоровье!

ED818 18.02.2023 17:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
11
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Комментарий объясняет проблему. Возможное решение

system(("echo '"s + static_cast<char>(i * 16 + 0xe) + "'").c_str());

Вы всегда можете использовать push_back() для добавления определенных байтов.

tadman 18.02.2023 17:31

@tadman, честно говоря, моя вина за копирование и вставку, хороший улов, это работает. Опасности мобильного телефона! -- и push_back() очень классная, спасибо за это

ED818 18.02.2023 17:41

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

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

Как обращаться со статическими членами и хранилищем класса шаблона в ситуациях, когда оставление статической очистки нежелательно
Вариативный класс шаблона, содержащий массив другого класса шаблона
Изменить инициализацию значения по умолчанию для перечисления с областью действия в С++ 20?
Правильно ли составлен приведенный ниже код, в частности, в отношении правил псевдонимов?
В С++, как получить доступ к атрибутам из подкласса объекта, который когда-то был создан как подкласс, но затем скопирован в суперкласс?
Как заставить C++ OpenGL Camera смотреть влево и вправо?
Как быть уверенным, что вся строка сразу записывается в файл на С++
Неверное преобразование из ‘const char*’ в ‘char*’ с помощью функции ```rindex```
Как заставить QTextCursor::WordUnderCursor включать больше символов или более длинные слова
Существуют ли какие-либо хорошие методы, чтобы избежать сломанного состояния программы в случае неожиданного сбоя?