Вопрос:
Я хотел бы инициализировать массив unsigned char с шестнадцатеричными значениями. Однако я, похоже, не знаю, как правильно инициализировать/получить доступ к этим значениям. Когда я пытаюсь получить к ним доступ, поскольку я, возможно, хочу интуитивно, я не получаю никакой ценности вообще.
Это мой вывод
The program was run with the following command: 4 Please be a value! ——> p Here some plaintext
при запуске с кодом ниже –
int main(int argc, char** argv) { int n; if (argc > 1) { n = std::stof(argv[1]); } else { std::cerr << «Not enough argumentsn»; return 1; } char buff[100]; sprintf(buff,»The program was run with the following command: %d»,n); std::cout << buff << std::endl; unsigned char plaintext[16] = {0x0f, 0xb0, 0xc0, 0x0f, 0xa0, 0xa0, 0xa0, 0xa0, 0x00, 0x00, 0xa0, 0xa0, 0x00, 0x00, 0x00, 0x00}; unsigned char test = plaintext[1]^plaintext[2]; std::cout << «Please be a value! ——> » << test << std::endl; std::cout << «Here some plaintext » << plaintext[3] << std::endl; return 0; }
В контексте контекста это часть группового проекта для школы. В конечном итоге мы пытаемся внедрить шифр Змея, но продолжаем сбиваться с неподписанными массивами символов. В нашей спецификации проекта говорится, что мы должны иметь две функции, которые принимают то, что было бы байт-массивами в Java. Я предполагаю, что ближайший родственник в C++ является unsigned char []. В противном случае я бы использовал вектор. В другом месте кода я реализовал функцию setKey, которая принимает массив unsigned char, упаковывает его значения в 4 длинных интервала (ключ должен быть 256 бит) и выполняет различные операции смены битов и xor для этих ints для генерации ключи, необходимые для криптографического алгоритма. Надеюсь, что достаточно фона для того, что я ищу. Я предполагаю, что я просто упускаю из виду некоторые основные функции C++. Спасибо за любую помощь!
Лучший ответ:
char – это 8-битное значение, способное хранить -128 <= n <= +127, часто используемое для хранения представлений символов в разных кодировках и обычно – в установках Western, Roman-alphabet – char используется для указания представления ASCII или utf закодированные значения. “Закодировано” означает, что символам/букве в наборе символов присвоены числовые значения. Подумайте о периодической таблице как кодировании элементов, так что “H” (водород) кодируется как 1, Германий как 32. В таблицах ASCII (и UTF-8) позиция 32 представляет символ, который мы называем “пробелом”.
Когда вы используете operator << по значению char, поведение по умолчанию состоит в том, чтобы предположить, что вы передаете ему кодировку символов, например код символа ASCII. Если вы это сделаете
char c = ‘z’; char d = 122; char e = 0x7A; char f = ‘x7a’; std::cout << c << d << e << f << «n»;
Все четыре присвоения эквивалентны. ‘z’ является ярлыком/синтаксическим сахаром для char(122), 0x7A является шестнадцатеричным для 122, а ‘ x7a’ – это escape, который формирует символ ascii со значением 0x7a или 122 – iez
Когда многие новые программисты ошибаются, они делают это:
char n = 8; std::cout << n << endl;
это не печатает “8”, он печатает символ ASCII в позиции 8 в таблице ASCII.
Подумайте на мгновение:
char n = 8; // stores the value 8 char n = a; // what does this store? char n = ‘8’; // why is this different than the first line?
Позволяет мгновенно перемотать: когда вы храните 120 в переменной, она может представлять символ ASCII ‘x’, но в конечном счете то, что хранится, – это просто числовое значение 120, простое и простое.
В частности: когда вы передаете 122 функции, которая в конечном итоге будет использовать ее для поиска записи шрифта из набора символов с использованием кодировок Latin1, ISO-8859-1, UTF-8 или подобных кодировок, тогда 120 означает ‘z’.
В конце дня char является всего лишь одним из стандартных значений целочисленных значений, он может хранить значения -128 <= n <= +127, он может тривиально продвигаться до short, int, long или long long, etc и т.д.
Хотя он обычно используется для обозначения символов, он также часто используется как способ сказать: “Я храню только очень маленькие значения” (например, целые проценты).
int incoming = 5000; int outgoing = 4000; char percent = char(outgoing * 100 / incoming);
Если вы хотите напечатать числовое значение, вам просто нужно продвинуть его на другой тип значения:
std::cout << (unsigned int)test << «n»; std::cout << unsigned int(test) << «n»;
или предпочтительный C++ способ
std::cout << static_cast<unsigned int>(test) << «n»; Ответ №1
Я думаю (не совсем понятно, что вы просите), что ответ так прост, как этот
std::cout << «Please be a value! ——> » << static_cast<unsigned>(test) << std::endl;
Если вы хотите вывести числовое значение символа char или unsigned, вы должны сначала перенести его в int или unsigned.
Неудивительно, что по умолчанию символы выводятся как символы, а не целые числа.
Кстати, этот трусливый код
char buff[100]; sprintf(buff,»The program was run with the following command: %d»,n); std::cout << buff << std::endl;
проще писать
std::cout << «The program was run with the following command: » << n << std::endl; Ответ №2
std::cout и std::cin всегда обрабатывает переменную char как char
Если вы хотите вводить или выводить как int, вы должны вручную сделать это, как показано ниже.
std::cin >> int_var; c = int_var; std::cout << (int)c;
Если вы используете scanf или printf, такая проблема не возникает, поскольку параметр формата (“% d”, “% c”, “% s”) указывает на скрытый входной буфер (integer, char, string).