如何从带有c ++的字符串中检索十六进制格式的字节值?

时间:2016-05-02 17:30:51

标签: c++

我正在开发一个使用RFID读写器(cr500)的项目

我遇到了如何将字符串"FFFFFFFFFFFF"转换为"\xFF\xFF\xFF\xFF\xFF\xFF"

的问题

string key = "FFFFFFFFFFFF";

string raw = "\xFF\xFF\xFF\xFF\xFF\xFF";

如何使用c ++标准库函数解决这个问题?

1 个答案:

答案 0 :(得分:1)

好吧,我会从字面上理解您的问题并专注于如何将字符文字"FFFFFFFFFFFF"转换为"\xFF\xFF\xFF\xFF\xFF\xFF"的目标字面值,因为您要求(双关语)意)。

以这种方式 1 来实现您所寻找的目标:

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>

int main()
{
    std::string input = "FFFFFFFFFFFF"; // << Let's suppose this is given from the GUI
    std::istringstream iss(input);
    std::string output;
    std::string sbyte;
    while(iss >> std::setw(2) >> sbyte) {
        std::cout << sbyte << std::endl;
        std::istringstream iss2(sbyte);
        unsigned u;
        iss2 >> std::hex >> u;
        output += (unsigned char)u;
    }

    // std::string::data() contains the resulting byte values:
    for(unsigned char x : output) {
        std::cout << std::hex << "\\x" << std::setw(2) << std::setfill('0') 
                  << (unsigned)x; 
    }
    std::cout << std::endl;
}

输出:

FF
FF
FF
FF
FF
FF
\xff\xff\xff\xff\xff\xff

请参阅Live Demo

您可以使用std::setw()控制输入字段宽度,如上所示。

注意:

这显然适用于std::string,但不能直接使用unsigned u;指定std::setw(2)

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>

int main()
{
    std::string input = "FFFFFFFFFFFF";
    std::istringstream iss(input);
    std::string output;
    unsigned u;
    while(iss >> std::setw(2) >> std::hex >> u) {
        std::cout << std::hex << std::setw(2) << std::setfill('0') <<  u << std::endl;
        output += (unsigned char)u;
    }

    for(unsigned char x : output) {
        std::cout << std::hex << "\\x" << std::setw(2) << std::setfill('0') 
                  << (unsigned)x; 
    }
    std::cout << std::endl;
}

Live Demo

<子>  1.您还可以在循环中使用std::string::substr()拆分输入字符串。