C++ 将std::字符串中的十六进制值存储在std::vector中,反之亦然?

C++ 将std::字符串中的十六进制值存储在std::vector中,反之亦然?,c++,string,stl,vector,C++,String,Stl,Vector,假设你有一个std::string(“死牛肉”),那么在std::vector(如果可能的话,最有可能是std::vector)中存储每两个值的最优雅的方式是什么呢?因此std::vector看起来有点像{0xDE,0xAD,0xBE,0xEF}(如果它是一个数组)?还有什么是撤销这个(std::vector->std::string)的最好方法。我选择简单的普通循环 int hexValue(int c) { if (c >= '0' && c <= '9'

假设你有一个
std::string(“死牛肉”)
,那么在std::vector(如果可能的话,最有可能是
std::vector
)中存储每两个值的最优雅的方式是什么呢?因此
std::vector
看起来有点像
{0xDE,0xAD,0xBE,0xEF}
(如果它是一个数组)?还有什么是撤销这个(
std::vector
->
std::string
)的最好方法。

我选择简单的普通循环

int hexValue(int c)
{
    if (c >= '0' && c <= '9') return c - '0';
    if (c >= 'A' && c <= 'F') return c - 'A' + 10;
    if (c >= 'a' && c <= 'f') return c - 'a' + 10;
    return -1;
}

std::vector<unsigned char> toBin(const std::string& s)
{
    std::vector<unsigned char> result;
    for (int i=0,n=s.size(); i<n-1; i+=2)
    {
        int x1 = hexValue(s[i]);
        int x2 = hexValue(s[i+1]);
        if (x1 >= 0 && x2 >= 0)
            result.push_back(x1*16 + x2);
    }
    return result;
}

std::string toHex(const std::vector<unsigned char>buf)
{
    const char *hex = "0123456789ABCDEF";
    int n = buf.size();
    std::string result(n*2, ' ');
    for (int i=0; i<n; i++)
    {
        result[i*2] = hex[buf[i]>>4];
        result[i*2+1] = hex[buf[i]&15];
    }
    return result;
}
inthexvalue(intc)
{
如果(c>='0'&&c='A'&&c='A'&&c=0)
结果:推回(x1*16+x2);
}
返回结果;
}
std::string toHex(const std::vectorbuf)
{
常量字符*hex=“0123456789ABCDEF”;
int n=buf.size();
std::字符串结果(n*2',);
对于(int i=0;i>4];
结果[i*2+1]=hex[buf[i]&15];
}
返回结果;
}
如果您需要此转换非常快(假设输入足够大且形式正确)

std::vector托宾(const std::string&s)
{
静态无符号字符H[256],L[256];
如果(L['1']==0)
{
对于(inti=0;i如何(尽管没有花哨的stl杂耍):

#包括
#包括
//编码器引发的异常
类解码错误{
公众:
解码错误(){}
解码错误(const char*s):msg(s){}
解码错误(const std::string&s):msg(s){}
const char*what(){return msg.c_str();}
私人:
std::字符串msg;
};
类六角编码器{
公众:
无效解码(常量std::string&str,std::vector&v);
私人:
无符号字符解码(char);
};
void HexEncoder::decode(常量std::string&s,std::vector&v)
{
如果(s.size()%2!=0)
抛出解码错误(“无效字符串长度”);
v、 保留(s.size()/2);
std::string::const_迭代器it=s.begin();
while(it!=s.end()){
无符号字符半字节1=解码(*it++);
无符号字符半字节2=解码(*it++);
v、 为(std::iterator it=str.begin();it!=str.end();std::advance(it,2))向后推(nibble1='0'&&c='A'&&c='A'&&c
)
{
char-tmp;
标准:复制(it,it+2,tmp);
scanf(“%02X”和tmp);
矢量推回(tmp);
}

这是您的转换的粗略草案,但我不确定它是否正确。

由于我的项目已经依赖于此,我将使用:

对于十六进制到字符串的转换:

boost::algorithm::unhex(stringValue, back_inserter(vectorValue));
boost::algorithm::hex(vectorValue, back_inserter(stringValue));

你的std::vector是否包含字符,或者你是否正在尝试转换二进制数据?感谢阅读我的文章。二进制数据将非常棒(fixed post#1)哦…那么对不起。我不喜欢鞭子、针、
bind1st
…我想知道哪种尝试是最有效的…这看起来很不错,但是
for(std::iterator<string> it = str.begin(); it != str.end(); std::advance(it, 2))
{
    char tmp;
    std::copy(it, it + 2, tmp);
    scanf("%02X", &tmp);
    vect.push_back(tmp);
}
#include <string>
#include <vector>
#include <iterator>

#include <boost/algorithm/hex.hpp>

...

string stringValue("DEADBEEF");
vector<unsigned char> vectorValue;
boost::algorithm::unhex(stringValue, back_inserter(vectorValue));
boost::algorithm::hex(vectorValue, back_inserter(stringValue));