在 C++ 中使用十六进制字符串的按位函数 AND、OR 和 XOR
Bitwise functions AND, OR and XOR using hexadecimal Strings in C ++
我有一个接受两个十六进制字符串值的函数,我需要让它们实现布尔函数 AND、OR 和 XOR,但我的实现没有提供预期值:
string A = "00000018631340800001";
string B = "FFFFFFFFFFFFFFE00000";
A 和 B 的预期答案 =“00000018631340800000”,但我的函数总是给出“00000000000000000000”。
这是我的片段:
string funcion_and(string valor1, string valor2)
{
int val_int[20 + 1] = {0};
char valC[20 + 1] = {0};
unsigned char valA[20 + 1] = {0};
unsigned char valB[20 + 1] = {0};
sscanf(valor1.c_str(), "%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX",
&valA[0], &valA[1], &valA[2], &valA[3], &valA[4], &valA[5], &valA[6], &valA[7], &valA[8], &valA[9]);
sscanf(valor2.c_str(), "%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX",
&valB[0], &valB[1], &valB[2], &valB[3], &valB[4], &valB[5], &valB[6], &valB[7], &valB[8], &valB[9]);
for(int i = 0; i < 10; i++)
{
val_int[i] = valA[i] & valB[i];
}
sprintf(valC, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", val_int[0], val_int[1], val_int[2], val_int[3], val_int[4], val_int[5], val_int[6], val_int[7], val_int[8], val_int[9]);
return string(valC);
}
我知道我还可以改进代码很多,但我想知道为什么它不起作用。
用 VS2017 试过你的代码,它有效。我怀疑您的问题可能来自 sscanf 或 sprintf。您也可以尝试使用 stringstream 进行转换:
#include <sstream>
#include <iomanip>
/* size refers to the string size */
std::string inthex_to_str(unsigned int i, unsigned int size)
{
std::stringstream stream;
stream << std::setfill('0') << std::setw(size) << std::hex << i;
return stream.str();
}
unsigned int str_to_inthex(string a)
{
unsigned int i;
std::stringstream stream;
stream << std::hex << a;
stream >> i;
return i;
}
string funcion1_and(string valor1, string valor2)
{
string str3 = "";
for (int i = 0; i < valor1.size() - 1; i += 2)
{
unsigned int val1 = str_to_inthex(valor1.substr(i, 2));
unsigned int val2 = str_to_inthex(valor2.substr(i, 2));
str3 += inthex_to_str(val1 & val2, 2);
}
return str3;
}
我有一个接受两个十六进制字符串值的函数,我需要让它们实现布尔函数 AND、OR 和 XOR,但我的实现没有提供预期值:
string A = "00000018631340800001";
string B = "FFFFFFFFFFFFFFE00000";
A 和 B 的预期答案 =“00000018631340800000”,但我的函数总是给出“00000000000000000000”。
这是我的片段:
string funcion_and(string valor1, string valor2)
{
int val_int[20 + 1] = {0};
char valC[20 + 1] = {0};
unsigned char valA[20 + 1] = {0};
unsigned char valB[20 + 1] = {0};
sscanf(valor1.c_str(), "%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX",
&valA[0], &valA[1], &valA[2], &valA[3], &valA[4], &valA[5], &valA[6], &valA[7], &valA[8], &valA[9]);
sscanf(valor2.c_str(), "%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX",
&valB[0], &valB[1], &valB[2], &valB[3], &valB[4], &valB[5], &valB[6], &valB[7], &valB[8], &valB[9]);
for(int i = 0; i < 10; i++)
{
val_int[i] = valA[i] & valB[i];
}
sprintf(valC, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", val_int[0], val_int[1], val_int[2], val_int[3], val_int[4], val_int[5], val_int[6], val_int[7], val_int[8], val_int[9]);
return string(valC);
}
我知道我还可以改进代码很多,但我想知道为什么它不起作用。
用 VS2017 试过你的代码,它有效。我怀疑您的问题可能来自 sscanf 或 sprintf。您也可以尝试使用 stringstream 进行转换:
#include <sstream>
#include <iomanip>
/* size refers to the string size */
std::string inthex_to_str(unsigned int i, unsigned int size)
{
std::stringstream stream;
stream << std::setfill('0') << std::setw(size) << std::hex << i;
return stream.str();
}
unsigned int str_to_inthex(string a)
{
unsigned int i;
std::stringstream stream;
stream << std::hex << a;
stream >> i;
return i;
}
string funcion1_and(string valor1, string valor2)
{
string str3 = "";
for (int i = 0; i < valor1.size() - 1; i += 2)
{
unsigned int val1 = str_to_inthex(valor1.substr(i, 2));
unsigned int val2 = str_to_inthex(valor2.substr(i, 2));
str3 += inthex_to_str(val1 & val2, 2);
}
return str3;
}