我正在处理的项目已经将iscsi设备的wwn存储为std :: string而不是冒号。我必须获取字符串的子集,然后对它们进行XOR运算,就好像它们是带有另一个字节集的字节一样,用于scsi命令安全代码。我也应该转换哪种数据类型的字符,以便XOR将它们视为十六进制字节。这些数字已经完全符合我的需要,但是编译器将把它们解释为ASCII。我只需要一种方法告诉编译器这些已经是十六进制字节。
字符串是601ad142,所以我也需要将其转换为[0x60、0x1a,0xd1、0x42],因此我可以将每个字节与[0x57、0x68、0x6f,0x61]异或
如果我可以将wwn字符串:600601601ad14200b9265b5b274efb84
(在现有代码中已经提供)转换为uinit64_t,我也可以使用它,但是:
std::string wwid(path.wwid);
wwid.erase(std::remove(wwid.begin(), wwid.end(), ':'), wwid.end());//remove colons
uint64_t wwn = wwid
std::istringstream strWwid(wwid);
strWwid >> wwn;
返回0x23cc7401
更新:我找到了可行的解决方案。
std::string wwid(path.wwid);
wwid.erase(std::remove(wwid.begin(), wwid.end(), ':'), wwid.end());
char wwnBytes[8];
strncpy( wwnBytes, wwid.c_str() + 6, 8); // get chars for bytes 4 -7
std::string bytes = wwnBytes;
std::stringstream ss;
unsigned int secBytes;
ss << std::hex << bytes;
ss >> secBytes;
答案 0 :(得分:0)
十六进制是文本表示形式– EXPLAIN ANALYZE
与WHERE rn = 1
相同。
您的字符串包含这些字符({0x60, 0x1a, 0xd1, 0x42}
,{96, 26, 209, 66}
等的(ASCII)表示形式,您需要将它们转换为它们表示的数字。
对于一个字符,类似
'6'
并要将两位数字转换为字节值,可以使用
'0'
然后// Assumes that c is an ASCII-encoded hexadecimal digit.
// TODO: Add input validation.
unsigned int from_hex(char c)
{
return (c <= '0' && c <= '9')
? c - '0'
: 10 + std::toupper(c) - 'A';
}
将产生111,以十六进制6f表示。
答案 1 :(得分:0)
我能够使用std :: stringstream:
std::string wwid(path.wwid);
wwid.erase(std::remove(wwid.begin(), wwid.end(), ':'), wwid.end());
char wwnBytes[8];
strncpy( wwnBytes, wwid.c_str() + 6, 8); // get chars for bytes needed
std::string bytes = wwnBytes;
std::stringstream ss;
unsigned int secBytes;
ss << std::hex << bytes;
ss >> secBytes; // bytes 4-7 in hex
结果无符号整数产生预期的十六进制值