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

Posted

技术标签:

【中文标题】C ++将mac id字符串转换为uint8_t数组【英文标题】:C++ converting a mac id string into an array of uint8_t 【发布时间】:2008-11-09 16:49:11 【问题描述】:

我想从命令行读取 mac id 并将其转换为 uint8_t 值的数组以在结构中使用它。我无法让它工作。我有一个关于: 的mac id 拆分的字符串向量,我想使用stringstream 来转换它们,但没有运气。我错过了什么?

int parseHex(const string &num)
  stringstream ss(num);
  ss << std::hex;
  int n;
  ss >> n;  
  return n;


uint8_t tgt_mac[6] = 0, 0, 0, 0, 0, 0;
  v = StringSplit( mac , ":" );
  for( int j = 0 ; j < v.size() ; j++ )
    tgt_mac[j] = parseHex(v.at(j)); 
  

【问题讨论】:

【参考方案1】:

我不想以这种方式回答这个问题,但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]);

【讨论】:

【参考方案2】:

您的问题可能出在解析数据的输出中。 "

示例程序:

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】:

首先我想指出,我认为@Steven 的答案是一个非常好的答案——我确实注意到了这一点:值是正确的,但输出看起来很尴尬。这是由于使用了ostream&amp; operator&lt;&lt;( ostream&amp;, 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 了解它的外观)

【讨论】:

【参考方案4】:

我认为你在错误的地方使用了 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";

【讨论】:

当我在解析函数中执行 cout 时,我得到了正确的值,但是当我将它们分配给 uint8_t 数组时,它们变得一团糟。我尝试了你的建议,它在函数中有效,但是当我分配它们时它们仍然搞砸了。

以上是关于C ++将mac id字符串转换为uint8_t数组的主要内容,如果未能解决你的问题,请参考以下文章

将“ff0000”之类的字符串转换为目标c中的十六进制数

如何将一串二进制数转换为 C 中的字符(每个字符都必须有一个半字节)?

C语言 字符串转数字 急急急

C语言:怎么将十进制数字转换为二进制字符串,谁能帮我写个函数

3. 从键盘上输入一个八进制数,利用指针将其转换为十进制数并输出 C语言 很急

c_cpp [十进制数转罗马数字]将一个十进制数字符串转换为罗马数字字符串#字符串处理