C ++将mac id字符串转换为uint8_t数组

时间:2008-11-09 16:49:11

标签: c++ string networking parsing

我想从命令行读取mac id并将其转换为uint8_t值的数组,以便在结构中使用它。我无法让它发挥作用。我有一个关于{id {1}}的mac id分割的字符串向量,我想用:来转换它们而没有运气。我缺少什么?

stringstream

4 个答案:

答案 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";
}