我有一个 MAC 地址,如“6F:e:5B:7C:b:a”,我想解析它并在:e:、:b:、:a 之前插入隐式零。
我目前无法使用 Boost,但我有一个粗略的解决方案。解决方案在':'上分裂。然后我计算它们之间的字符,如果只有一个,我在前面插入一个零。
我想知道是否有人有更快的方法?
我有一个 MAC 地址,如“6F:e:5B:7C:b:a”,我想解析它并在:e:、:b:、:a 之前插入隐式零。
我目前无法使用 Boost,但我有一个粗略的解决方案。解决方案在':'上分裂。然后我计算它们之间的字符,如果只有一个,我在前面插入一个零。
我想知道是否有人有更快的方法?
首先,您可以使用转换速度非常快的脚本char
,int
因此:
unsigned char hex_to_int(const char c)
{
if( c >= 'a' && c <= 'f'){
return c - 'a' + 10;
}
if( c >= 'A' && c <= 'F'){
return c - 'A' + 10;
}
if( c >= '0' && c <= '9'){
return c - '0';
}
return 0;
}
然后您可以创建将遍历字符串的循环:
unsigned char mac[6]; /* Resulting mac */
int i; /* Iteration number */
char *buffer; /* Text input - will be changed! */
unsigned char tmp; /* Iteration variable */
for( i = 0; i < 6; ++i){
mac[i] = 0;
/*
* Next separator or end of string
* You may also want to limit this loop to just 2 iterations
*/
while( ((*buffer) != '\0') && ((*buffer) != ':'){
mac[i] <<= 4;
mac[i] |= hex_to_int( *buffer);
++buffer;
}
}
if( (i != 6) || (*buffer != NULL)){
// Error in parsing, failed to get to the 6th iteration
// or having trailing characters at the end of MAC
}
此功能不进行任何错误检查,但它可能是您将获得的最快解决方案。
对于快速和肮脏的:
if (sscanf(text, "%x:%x:%x:%x:%x:%x",
&mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) != 6) {
// handle error
}
请注意,它不检查数字是否真的是十六进制。sscanf() 的通常预防措施适用。