我想从命令行读取mac id并将其转换为uint8_t
值的数组,以便在结构中使用它。我无法让它发挥作用。我有一个关于{id {1}}的mac id分割的字符串向量,我想用:
来转换它们而没有运气。我缺少什么?
stringstream
答案 0 :(得分:3)
我讨厌以这种方式回答这个问题,但sscanf()
可能是解析MAC地址最简洁的方法。它处理零/非零填充,宽度检查,大小写折叠以及所有其他人无法处理的内容。无论如何,这是我的不那么C ++版本:
void
parse_mac(std::vector<uint8_t>& out, std::string const& in) {
unsigned int bytes[6];
if (std::sscanf(in.c_str(),
"%02x:%02x:%02x:%02x:%02x:%02x",
&bytes[0], &bytes[1], &bytes[2],
&bytes[3], &bytes[4], &bytes[5]) != 6)
{
throw std::runtime_error(in+std::string(" is an invalid MAC address"));
}
out.assign(&bytes[0], &bytes[6]);
}
答案 1 :(得分:2)
首先,我想指出,我认为@Steven的答案是非常好的 - 确实我注意到了相同的:值是正确的,但输出看起来很尴尬。这是由于使用了ostream& operator<<( ostream&, unsigned char )
,因为您使用的uint8_t
类型是unsigned char
的typedef(正如我在linux手册页中找到的那样)。请注意,在VC ++上,typedef不存在,您必须使用unsigned __int8
代替(这也将引导您进入char
专业化。)
接下来,您可以测试您的代码(与输出无关):
assert( uint8_t( parseHex( "00" ) ) == uint8_t(0) );
assert( uint8_t( parseHex( "01" ) ) == uint8_t(1) );
//...
assert( uint8_t( parseHex( "ff" ) ) == uint8_t(255) );
除了Steven的回答之外,我只想指出transform
算法的存在,它仍然可以简化您的代码。
for( int j = 0 ; j < v.size() ; j++ ){
tgt_mac[j] = parseHex(v.at(j));
}
写一行:
std::transform( v.begin(), v.end(), tgt_mac, &parseHex );
(我知道这与问题无关......)
(参见codepad.org了解它的内容)
答案 2 :(得分:1)
您的问题可能出在解析数据的输出中。 “&lt;&lt;&lt;&lt; operator根据传递的数据类型决定如何显示数据,uint8_t可能会被解释为char。确保在打印时将数组值转换为整数,或在调试器中进行调查。
示例程序:
uint8_t tgt_mac[6] = {0};
std::stringstream ss( "AA:BB:CC:DD:EE:11" );
char trash;
for ( int i = 0; i < 6; i++ )
{
int foo;
ss >> std::hex >> foo >> trash;
tgt_mac[i] = foo;
std::cout << std::hex << "Reading: " << foo << std::endl;
}
std::cout << "As int array: " << std::hex
<< (int) tgt_mac[0]
<< ":"
<< (int) tgt_mac[1]
<< ":"
<< (int) tgt_mac[2]
<< ":"
<< (int) tgt_mac[3]
<< ":"
<< (int) tgt_mac[4]
<< ":"
<< (int) tgt_mac[5]
<< std::endl;
std::cout << "As unint8_t array: " << std::hex
<< tgt_mac[0]
<< ":"
<< tgt_mac[1]
<< ":"
<< tgt_mac[2]
<< ":"
<< tgt_mac[3]
<< ":"
<< tgt_mac[4]
<< ":"
<< tgt_mac[5]
<< std::endl;
给出以下输出(cygwin g ++)
Reading: aa
Reading: bb
Reading: cc
Reading: dd
Reading: ee
Reading: 11
As int array: aa:bb:cc:dd:ee:11
As unint8_t array: ª:»:I:Y:î:◄
答案 3 :(得分:0)
我认为你在错误的地方使用std :: hex:
#include <sstream>
#include <iostream>
int main()
{
std::string h("a5");
std::stringstream s(h);
int x;
s >> std::hex >> x;
std::cout << "X(" << x << ")\n";
}