
在最近完成计算机网络课程设计的过程中,您需要将mac地址转换为六个字节. 我在互联网上找到了信息. 基本思想是将mac地址分为六个部分,每个部分为十六个. 基数将转换为十进制数,并分配给六字节数组的每一位. 后来,当查看库函数时,我发现了strtoul函数,并发现该函数可用于实现此函数. 实现功能如下:
int mac_str_to_bin( char *str, unsigned char *mac)
{
int i;
char *s, *e=NULL;
if ((mac == NULL) || (str == NULL)) {
return -1;
}
s = (char *) str;
for (i = 0; i < 6; ++i) {
mac[i] = s ? strtoul (s, &e, 16) : 0;
if (s)
s = (*e) ? e + 1 : e;
}
return 0;
}

测试步骤如下:
int main(void)
{
char *p = "11:22:33:44:55:66";
unsignedchar dst[6];
mac_str_to_bin(p,dst);
printf("mac:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
dst[0], dst[1], dst[2], dst[3], dst[4], dst[5]);
return 0;
}

打印结果为:
mac:11:22:33:44:55:66

我将简要分析该功能的实现方式.
unsigned long int strtoul(const char *nptr, char **endptr, int base);

首先介绍strtoul函数. 它将以数字字符或符号字符开头,直到遇到非数字字符或字符串,停止读取,并读取base指定的数字字符串. 在基本模式下,nptr转换为长整数后,将指向停止时读取的位置,即在读取过程中遇到的非数字字符或字符串的位置. 这个地方也是endptr指针通过辅助指针来达到的目的.
在上面的实现函数中,主要实现是在for循环中. 第一句mac [i] = s? strtoul(s,&e,16): 0;首先确定s是否为空,如果前一个时间已到,如果整个mac解析完毕,则s将设置为空;如果s不为空,则表示mac地址解析尚未完成. 通过调用strtoul(),可以解析mac地址的一部分. 第二句是否(s)s =(* e)? E + 1: e;如果s不为空,则表示解析未完成,并且s当前为上一次解析过程中遇到的非数字字符或字符串的地址. 即,分隔符冒号': '的位置,此语句为删除该结肠.
实际上,在linux源代码中,实现此目标时也使用了本文开头提出的想法cstring 数组 声明,但它封装在函数库中. 由于库函数中包含API接口,因此我们不需要自己编写它们.
此功能的Linux源代码如下:
unsigned long long int strtoul(const char *ptr, char **end, int base)
{
unsigned long long ret = 0;
if (base > 36)
goto out;
while (*ptr) {
int digit;
if (*ptr >= '0' && *ptr <= '9' && *ptr < '0' + base)
digit = *ptr - '0';
else if (*ptr >= 'A' && *ptr < 'A' + base - 10)
digit = *ptr - 'A' + 10;
else if (*ptr >= 'a' && *ptr < 'a' + base - 10)
digit = *ptr - 'a' + 10;
else
break;
ret *= base;
ret += digit;
ptr++;
}
out:
if (end)
*end = (char *)ptr;
return ret;
}
上述方法解决了将MAC地址转换为数组的问题,但是我遇到了一个新问题,即在vs2015的mac地址输入框中获取的mac地址是CString类型cstring 数组 声明,但是上面的函数参数它是一个char *类型. 因此,您必须首先将CString类型的mac地址转换为char *类型. 因此,我查找了一些信息,发现了一个更好的功能. 代码如下:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-149690-1.html
特么都不知道在后台下载什么鬼
先进些