Строка символов в шестнадцатеричный массив символов в С++

У меня есть устройство CLinux, и мне нужно преобразовать некоторые данные. Вход что-то вроде

char mytest[] = "020441010C0000003131203131203131313103";

и мне нужно иметь

mytest2[] = {0x02,0x04,0x41,0x01,0x0C,0x00,0x00,0x00,0x31,0x31,0x20,0x31,0x31,0x20,0x31,0x31,0x31,0x31,0x03}

Это код, который я пробовал, но он не компилируется, потому что sstream не находится в ОС устройства. Может ли кто-нибудь дать мне другое решение для преобразования данных?

#include <iostream>
#include <sstream>


int main() {
std::string myStr = "1122AA010A";

std::stringstream ss;
int n;
for(int i = 0; i<myStr.length(); ) {
    std::istringstream(myStr.substr(i,2))>>std::hex>>n;
    ss<<(char)n;
    i += 2;
    }

std::string result = ss.str();

std::cout<<"\n"<<result<<"\n";
return 0;
}
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
52
1

Ответы 1

Разобрать шестнадцатеричный код довольно просто. Преобразуйте каждую цифру в ее шестнадцатеричное значение и объедините их вместе в один символ.

int FromHexDigit(char c) //Returns a number from 0 to 15
{
    if (c >= '0' && c <= '9')
        return c-'0';
    else if (c >= 'A' && c <= 'F')
        return c-'A' + 10;
    else if (c >= 'a' && c <= 'f')
        return c-'a' + 10;
    else
        return -1; //Not a hex digit :(
}

Тогда основной цикл становится:

std::string result;
for(int i = 0; i<myStr.length(); i += 2) {
    char d1 = myStr[i], d2 = myStr[i+1]; //Those are the two consecutive hex digits
    int n = FromHexDigit(d1)*16 + FromHexDigit(d2); //Convert to a number
    result += (char)n; //Put into the result string
}

Обратите внимание на часть i+=2 в заголовке цикла for. Мы обрабатываем строку в двухбайтовых фрагментах. Нет обработки ситуации, когда строка имеет нечетное количество символов.

Что вы имеете в виду под convert each digit to its hex value? Нет способа работать как с подстроками, работая с 2 цифрами одновременно? (потому что они уже в шестнадцатеричном формате)

SE-LM 19.03.2019 18:40

@ SE-LM вы можете сделать подстроку размера 2, затем создать из нее строку, а затем извлечь в шестнадцатеричном формате, но это намного дороже

bruno 19.03.2019 18:42

странно помещать результат в строку, vector<unsigned> или эквивалент кажется более естественным, не так ли?

bruno 19.03.2019 18:43

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