Я пытаюсь вывести шестнадцатеричное значение, используя переменную для числа. Вот пример без 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 и т.д.
system((std::string("echo '") + char(i*16+0xe) + '\'').c_str());
. Я не знаю, что это должно делать, но это эквивалент первого вызова.
Вы находитесь на языке, полностью способном манипулировать байтами. Вам не нужно полагаться на нотацию \x
, которая удобна для людей.
@Eljay Eljay Я думал, что он отправил оператор эха внутри system() за один раз. Возможно ли это? Чтобы подготовить всю строку system(), а затем запустить ее?
'\x6e'
буквально просто число 110 — 6e в шестнадцатеричном виде — как char
. .
@tadman, твоя первая фраза вселяет в меня душевное спокойствие и надежду. Ваше второе предложение напоминает мне, что я ничего не знаю. Но я думаю, что вы дали мне некоторые идеи о том, что Google.
\x##
и другие управляющие последовательности обрабатываются очень рано в процессе компиляции при лексировании токенов (например, выясняется, что "\x24"
является строковым литералом). Как только компилятор прочитает этот небольшой фрагмент кода как строковый литерал, ваша возможность использовать escape-последовательности исчезнет навсегда, за одним очень специфическим «исключением», которое здесь не имеет значения.
@IgorTandetnik Игорь, это работает, но вы говорите, что не знаете, почему я думаю, что вы проверили ресурс ... не могли бы вы связать меня с этим ресурсом? :)
@Крис очень крутой. Могу ли я заставить конкатенацию переменных целиком читаться как строковый литерал? Как a+b+c+d, где каждая переменная была \x6e соответственно.
@ ED818, Почти, как только каждая строка имеет свой окончательный набор символов (на самом деле байтов), вы можете манипулировать ими по своему усмотрению. Результат не может быть строковым литералом, если только каждая часть не является строковым литералом, но это может быть что-то, что работает в тех же местах, что и строковый литерал, например, как в ответе.
@chris bah вы, ребята, такие крутые. Я учился на этом более десяти лет, и это первый раз, когда мне пришлось самому задавать вопрос. Ваше здоровье!
Комментарий объясняет проблему. Возможное решение
system(("echo '"s + static_cast<char>(i * 16 + 0xe) + "'").c_str());
Вы всегда можете использовать push_back() для добавления определенных байтов.
@tadman, честно говоря, моя вина за копирование и вставку, хороший улов, это работает. Опасности мобильного телефона! -- и push_back() очень классная, спасибо за это
В первом примере
\x6e
обрабатывается как один байт во время компиляции. Во втором примере конкатенация происходит во время выполнения, то есть намного позже факта интерпретации во время компиляции.