У меня есть устройство 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;
}





Разобрать шестнадцатеричный код довольно просто. Преобразуйте каждую цифру в ее шестнадцатеричное значение и объедините их вместе в один символ.
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. Мы обрабатываем строку в двухбайтовых фрагментах. Нет обработки ситуации, когда строка имеет нечетное количество символов.
@ SE-LM вы можете сделать подстроку размера 2, затем создать из нее строку, а затем извлечь в шестнадцатеричном формате, но это намного дороже
странно помещать результат в строку, vector<unsigned> или эквивалент кажется более естественным, не так ли?
Что вы имеете в виду под
convert each digit to its hex value? Нет способа работать как с подстроками, работая с 2 цифрами одновременно? (потому что они уже в шестнадцатеричном формате)