由MAC地址在18字节及6字节之间的转换引发越界问题讨论

导读:本篇文章讲解 由MAC地址在18字节及6字节之间的转换引发越界问题讨论,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

MAC地址在18字节及6字节之间的转换

#define unsigned int u32
#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
#define MACSTOL(a)  (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
#define MACLTOS(a)  (u32 *)&(a)[0], (u32 *)&(a)[1], (u32 *)&(a)[2], (u32 *)&(a)[3], (u32 *)&(a)[4], (u32 *)&(a)[5]
 
 
int main(int argc,char argv[])
{
    u8 mac_add[18] = "00:12:32:4a:56:7b";
    u8 mac_add_tmp[6] = {0};
    u8 mac_add_test[18] = {0};
     
    /*用sscanf将18字节转为6字节,有的编译器可以不用(u32 *)进行强转*/
    sscanf(mac_add, MACSTR, MACLTOS(mac_add_tmp));
    /*6字节转为18字节*/
    snprintf(mac_add_test, 18, MACSTR, MACSTOL(mac_add));
     
    printf("original : %s  new : %s\n", mac_add, mac_add_test);
    return 0;
}

1、以上转换,暗含内存越界问题,因为mac_add是char * 类型, 所以每一个数组成员占1个字节, 但是sscanf在格式化得时候%x指定了存储单元为4字节(整形), 所以会有3个字节得内存越界出现。

2、16行形参传参问题

 

正确如下: 

MAC地址在18字节及6字节之间的转换

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

// MAC地址字符集(6字节)转字符串(18字节)
#define mac_to_str(mac_chs, mac_str)\
			do{\
				snprintf(mac_str, 18, "%02x:%02x:%02x:%02x:%02x:%02x", \
				mac_chs[0], mac_chs[1], mac_chs[2], mac_chs[3], mac_chs[4], mac_chs[5]); \
			}while(0)

// MAC地址字符串(18字节)转字符集(6字节)
#define mac_to_chs(mac_str, mac_chs)\
			do{\
				unsigned int ui32_mac[6] = {0}; /* 定义一个临时变量来处理内存越界问题 */ \
				sscanf(mac_str, "%x:%x:%x:%x:%x:%x", &ui32_mac[0], &ui32_mac[1], &ui32_mac[2], &ui32_mac[3], &ui32_mac[4], &ui32_mac[5]);\
				for (int i = 0; i < 6; i++)\
					mac_chs[i] = ui32_mac[i] & 0xff;\
			}while(0)
// 缩写
// str -- string        -- 字符串 ,不能包含0, '\0'
// chs -- character set -- 字符集 ,允许包含0, '\0'
int main()
{
	unsigned char mac_str[18] = "00:12:32:4a:56:7b";   // MAC地址字符串
	unsigned char mac_chs[6]  = {0};                   // MAC地址字符集
	
	//1.MAC地址字符串(18字节)转字符集(6字节)
	printf("#1 %s\n", mac_str);
	mac_to_chs(mac_str, mac_chs);
	printf("#2 %s\n", mac_str);
	// 打印
	for (int i = 0; i< 6; i++)
		printf("%02x ", mac_chs[i]);
	printf("\n");
	
	//2.MAC地址字符集(6字节)转字符串(18字节)
	unsigned char mac_str_x[18] = {0};                 // MAC地址字符串
	mac_to_str(mac_chs, mac_str_x);
	//打印
	printf("mca_str = %s\n", mac_str_x);
	
	//3.验证格式化后得MAC地址是否相等
	if (memcmp(mac_str, mac_str_x, 18) == 0)
	{
		printf("==========\n"); // 相等
	}
	else
	{
		printf("!!!!!=====\n"); // 不相等
		printf("%s\n", mac_str);
		printf("%s\n", mac_str_x);
	}
	
	return 0;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96512.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!