Применение функции XOR для значения в hex
Имею 2 значения в формате hex представленном в массиве char
8dcd8130d550168cc2ce3352e0a834d1
06905e6ea2994d929c1f1f5d753b793a
Необходимо применить к ним функцию XOR, но если применять вот так:
for(int i = 0; i<32; i++)
{
c[i] = (char)(a[i] ^ b[i]);
}
то получится результат XOR для этих массивов, а мне нужно посчитать для самих значений hex, т.е. для парных символов.
8d cd 81 30 d5 50 16 8c c2 ce 33 52 e0 a8 34 d1
Подскажите пожалуйста, как правильно сделать? По идее результат должен получится такой:
8b5ddf5e77c95b1e5ed12c0f95934deb
Ответы (1 шт):
Автор решения: n1tr0xs
→ Ссылка
Можно так, например:
#include <iostream>
#include <sstream>
#include <cmath>
int main(){
std::string str1 = "8dcd8130d550168cc2ce3352e0a834d1";
std::string str2 = "06905e6ea2994d929c1f1f5d753b793a";
std::stringstream stream;
// если строки точно будут одной длины, то этот код можно убрать
int len1 = str1.length();
int len2 = str2.length();
std::string *to_in = (len1>len2) ? &str2 : &str1;
for(int i=0, k = abs(len1-len2); i<k; ++i)
to_in->insert(0, "0");
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
for(int i=0; i<str1.length(); i+=2){
unsigned char x1 = std::stoi(str1.substr(i, 2), nullptr, 16);
unsigned char x2 = std::stoi(str2.substr(i, 2), nullptr, 16);
unsigned int r = x1^x2;
if(r<=15) stream << '0';
stream << std::hex << r;
}
std::string result = stream.str();
std::cout << result;
return 0;
}