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));