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& 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 了解它的外观)
【讨论】:
【参考方案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数组的主要内容,如果未能解决你的问题,请参考以下文章
如何将一串二进制数转换为 C 中的字符(每个字符都必须有一个半字节)?
C语言:怎么将十进制数字转换为二进制字符串,谁能帮我写个函数