C ++将Wwn字符串转换为识别为十六进制的数据类型

时间:2018-08-14 14:34:54

标签: c++

我正在处理的项目已经将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; 

2 个答案:

答案 0 :(得分:0)

十六进制是文本表示形式– EXPLAIN ANALYZEWHERE 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

结果无符号整数产生预期的十六进制值