1、如何描述 MAC地址
最常用的有两种:
1、字符串
char *addr="52:54:00:29:e4:4b"; // 长度17,有效值都是16进制表示的
2、数组
/* MAC Address */
typedef struct {
uint8_t b[6];
} __attribute__((packed)) macaddr_t;
2、如何检测输入的mac地址是有效的?
// 这里参考了bluez的源码
int mac_check(const char *str)
{
if (!str)
return -1;
if (strlen(str) != 17)
return -1;
while (*str) {
if (!isxdigit(*str++))
return -1;
if (!isxdigit(*str++))
return -1;
if (*str == 0)
break;
if (*str++ != ':')
return -1;
}
return 0;
}
注 :int isxdigit(int c); 是一个标准C库函数,头文件在 ctype.h,用来判断传入的字符是不是十六进制的字符。我们知道十六进制一般用数字 0 到 9 和字母 A 到 F(或 a~f)表示,其中 A~F 表示 10~15: 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F。如果不是,isxdigit 返回0。
3、两种MAC地址表示方法的转换
int ba2str(const macaddr_t *ba, char *str)
{
return sprintf(str, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
ba->b[5], ba->b[4], ba->b[3], ba->b[2], ba->b[1], ba->b[0]);
}
int str2ba(const char *str, macaddr_t *ba)
{
int i;
if (mac_check(str) < 0) {
memset(ba, 0, sizeof(*ba));
return -1;
}
for (i = 5; i >= 0; i--, str += 3)
ba->b[i] = strtol(str, NULL, 16);
return 0;
}
long int strtol(const char *str, char **endptr, int base) 把参数 str 所指向的字符串根据给定的 base 转换为一个长整数