由MAC地址在18字节及6字节之间的转换引发越界问题讨论
生活随笔
收集整理的這篇文章主要介紹了
由MAC地址在18字节及6字节之间的转换引发越界问题讨论
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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; }?
總結
以上是生活随笔為你收集整理的由MAC地址在18字节及6字节之间的转换引发越界问题讨论的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT mingw 编译Crypto++
- 下一篇: QString string char*