从字符串中提取网络适配器的Mac地址(char* 转hex)

原创 2016年08月29日 22:33:59

网络适配器的MAC地址为全球唯一的6字节(48位)地址,标识一台计算机地址(一台计算机可以装多个网络适配器,因此可以有多个MAC地址),是固化在适配的ROM中的地址。

将char数组类型(字符串型)的MAC转化为十六进制:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define uint unsigned int 
#define uchar unsigned char

#define MAC_ADDRESS_LEN 6		/* mac地址长为6位十六进制数*/

typedef enum tagMac_Format
{
	MAC_FORMAT_2PART = 0,
	MAC_FORMAT_3PART,
	MAC_FORMAT_6PART_1,
	MAC_FORMAT_6PART_2,
	MAC_FORMAT_ANY,
	MAC_FORMAT_BUTT
}Mac_Format;

typedef struct strParseInfo
{
	char *szFmt;
	uint uiLen;
}STR_PARSE_INFO_S;

/* Mac 地址以字符串呈现的四种不同方式 */
STR_PARSE_INFO_S g_astMacInfo[MAC_FORMAT_BUTT]=	
{
	{"%c%c%c%c%c%c-%c%c%c%c%c%c",13},
	{"%c%c%c%c-%c%c%c%c-%c%c%c%c",14},
	{"%c%c-%c%c-%c%c-%c%c-%c%c-%c%c",17},
	{"%c%c:%c%c:%c%c:%c%c:%c%c:%c%c",17},
	{"",0}
};
bool str_2_hex(char *szData,uchar *pucHex)
{
	uint uiLen = 0;
	uint i=0;
	char szByte[3]={0};
	char *pcEndptr = NULL;
	
	/* 参数检查 */
	if ((NULL == szData) || (NULL == pucHex))
	{
		printf("Invalid points: p1(%p),p2(%p).",szData,pucHex);
		return false;
	}

	uiLen = (uint)strlen(szData);
	if (0 != uiLen %2)		//mac地址应该有12个字符(even)
	{
		printf("Invalid strlen(mac add should be even) : %d\n",uiLen);
		return false;
	}

	for (i =0;i<uiLen;i+=2,pucHex++)
	{
		szByte[0]= szData[i];
		szByte[1]= szData[i+1];
		*pucHex = (uchar)strtoul(szByte,&pcEndptr,16); /* 将字符转化为指定格式(16进制) */
		if (2 != (uint)(pcEndptr-szByte))		
		{
			printf("Invalid source str(%s).",szData);
			return false;
		}
	}
	return true;
}
/************************************************************************/
/*
	从字符串中解析Mac地址(转为6位十六进制数)
*/
/************************************************************************/
bool ParseMacForStr(Mac_Format enMacfmt,char *szMac,uchar *pucMac)
{
	uint uiBegin = 0;
	uint uiEnd = 0;
	uint uiLoop = 0;
	int iParseCnt =0;
	char szChs[MAC_ADDRESS_LEN*2+1]={0};

	if ((enMacfmt >= MAC_FORMAT_BUTT) || (NULL == szMac) || (NULL == pucMac))
	{
		printf("Invalid inputs: p1(%d),p2(%p),p3(%p)\n",enMacfmt,szMac,pucMac);
		return false;
	}
	if (MAC_FORMAT_ANY == enMacfmt)
	{
		uiBegin = MAC_FORMAT_2PART;
		uiEnd =MAC_FORMAT_6PART_2;
	}
	else
	{
		uiBegin = enMacfmt;
		uiEnd = enMacfmt;
	}
	for (uiLoop = uiBegin;uiLoop<=uiEnd;++uiLoop)
	{	
		/* 逐字符解析并存在szChs中 */
		iParseCnt = sscanf(szMac,g_astMacInfo[uiLoop].szFmt,
						&szChs[0],&szChs[1],&szChs[2],&szChs[3],
						&szChs[4],&szChs[5],&szChs[6],&szChs[7],
						&szChs[8],&szChs[9],&szChs[10],&szChs[11]);
		if (MAC_ADDRESS_LEN *2 == iParseCnt) /* 应该解析了12个字符 */
		{
			break;
		}
	}
	/* 转化为十六进制 */
	if (true != str_2_hex(szChs,pucMac))
	{
		printf("Parse failed!\n");
		return false;
	}
	return true;
}

void test_fun()
{
	char szMacStr[20]="aa-bb-cc-dd-12-b3";
	uchar aucResMac[MAC_ADDRESS_LEN+1]={0};
	if (!ParseMacForStr(MAC_FORMAT_ANY,szMacStr,aucResMac))
	{
		printf("test fun parse failed !");
		return ;
	}
	printf("Mac addr is : \n");
	for (uint i=0;i<MAC_ADDRESS_LEN;++i)
	{
		printf("%x",*(aucResMac+i));
	}
	printf("\n");
	return ;
}
int main()
{
	test_fun() ;

	return 0;
}


相关文章推荐

[winphone][C#]MAC算法的实现

本算法基于DES,3DES算法。 函数签名(其中hexContent指需要计算MAC的16进制字符串,hexKey为16进制密钥串-长度16字节) public static string MAC(s...
  • onyxio
  • onyxio
  • 2013年11月14日 14:42
  • 1131

Mac地址和字符串之间的转换

废话少说,直接上代码std::string MacConvert::MacToStr(UINT8 * pMac,const char chKen/* = ':'*/){char szFormat[] ...

Mac地址和字符串之间的转换

[cpp] view plaincopy std::string MacToStr(UINT8 * pMac,const char chKen/* = ':'*/)   ...
  • ljh0302
  • ljh0302
  • 2015年12月24日 17:10
  • 1193

用sscanf格式化MAC地址

今天要从配置文件中读MAC地址,习惯上写成sscanf (buf, "%02X:02X:02X:02X:02X:02X",        &mac[0],        &mac[1],       ...

linux C 写MAC地址

// luo //  gcc  mac.c //  sudo ./a.out // http://www.360doc.com/content/12/0406/08/1317564_20...

实现MAC地址转换成十六进制

实现将mac地址(如:"00:FF:0A:0C:06:03")转换成十六进制存储的00FF0A0C0603 方法一: #include "stdio.h" #include "string.h"...

Linux下用C语言将一个字符串格式(char*)的MAC地址转换为十六进制数组

#include #include unsigned char a2x(const char c) { switch(c) { case '0'......
  • Aniu127
  • Aniu127
  • 2014年03月05日 17:34
  • 987

MAC地址 中 MAC地址字符串 到 MAC地址数值的 转换

转自:http://hi.baidu.com/xlt1888/item/b6bc48910c745fe0291647e7 MAC地址 中 MAC地址字符串 到 MAC地址数值的 转换 MAC地址为...
  • occupy8
  • occupy8
  • 2013年07月12日 15:40
  • 7575

用sscanf转换MAC字符串为BYTE数组时遇到的问题

需求如下:将表示MAC地址的字符串 "A1B2C3D4E5F6"转换为 BYTE mac[6] = {0xA1, 0xB2, 0xC3, 0xD4, 0xE5, 0xF6}; Google了网络上的使...

mac地址转换为6字节数组--strtoul函数

最近工作中需要在网络中传递mac地址,需要将mac地址转换为六个字节,网上找了找资料,基本的思路就是用根据冒号将mac地址分为六段,  每段看做一个十六进制数,转化为十进制数后,分配赋值给六字节数组的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从字符串中提取网络适配器的Mac地址(char* 转hex)
举报原因:
原因补充:

(最多只允许输入30个字)