Как преобразовать вектор <int>в массив символов? - PullRequest
0 голосов
/ 29 мая 2020

Платформа - Windows с MSV C. Я пишу функцию распаковки шифрования.

У меня много vector<int> результатов функции дешифрования. vector<int> может содержать строку UTF-8, или это может быть мусор, если параметры дешифрования были неправильными. Мне нужно вычесть число из каждой позиции, а затем посмотреть, является ли это допустимой строкой UTF-8. Это схема заполнения : добавьте позицию символа к себе перед шифрованием.

Чтобы отобразить результаты, я предполагаю, что мне нужно преобразовать vector<int> в vector<char>. Затем я могу использовать это как const char[] и распечатать его на консоли.

Как мне справиться с возможностью переполнения и потери значимости при преобразовании в char? В конце концов, char подписан и имеет диапазон от -128 до 127 на моей платформе.

std::vector<char> unpad(const std::vector<int>& input) {
    std::vector<char> output;
    for (int i{ 0 }; i < input.size(); ++i) {
        if (input[i] < -128 || input[i] > 127) {
            printf("oops overflow\n");
        }
        output.push_back(static_cast<char>(input[i] - i)); // Padding scheme
    }
    output.push_back(static_cast<char>(0)); // Null termination
    return output;
}

1 Ответ

2 голосов
/ 29 мая 2020

Я думаю, вы неправильно рассматриваете эту проблему. Вы не хотите преобразовывать int в char, так как вы потеряете информацию. Вы хотите сохранить информацию в int. Вам нужно понять, что int - это 32 бита, а char - 8 бит. Поэтому вам нужно 4 символа для хранения всей информации из одного int. Чтобы извлечь информацию из одного int, вам нужно использовать битовые операторы

char a = some_int & 0x000000ff;
char b = some_int & 0x0000ff00;
char c = some_int & 0x00ff0000;
char d = some_int & 0xff000000;

. Теперь у вас будет 4 байта (символы), которые сопоставляются с частями в одном int. Оттуда вы можете декодировать utf-8.

Обратите внимание, что в 64- и 32-битных системах int занимают 4 байта.

...