C语言如何将0X前缀十六进制字符数组转换为ULONGLONG类型MAC地址
错误原因
你直接用(unsigned long long)prefixAddr1强转拿到乱码是核心概念错误:prefixAddr1是字符数组,直接强转得到的是数组在内存中的首地址,和字符串本身代表的十六进制数值没有任何关系,内存地址是程序运行时随机分配的,自然输出乱码。
正确实现方案
使用C标准库提供的strtoull函数即可完成十六进制字符串到unsigned long long(对应Windows定义的ULONGLONG)的转换,该函数会自动识别字符串开头的0X/0x十六进制前缀,不需要手动截断前缀处理,转换结果和你手动写十六进制字面量赋值的效果完全一致。
实现步骤
- 首先引入对应头文件:
#include <stdlib.h> - 在你完成字符串拼接、得到
prefixAddr1/prefixAddr2之后,调用函数完成转换:typedef ULONGLONG BT_ADDR; // 转换逻辑 BT_ADDR btAddr1 = (BT_ADDR)strtoull(prefixAddr1, NULL, 16); BT_ADDR btAddr2 = (BT_ADDR)strtoull(prefixAddr2, NULL, 16); // 验证输出,和你手动赋值的打印逻辑一致 printf("Address 1: %llu\n", btAddr1); printf("Address 2: %llu\n", btAddr2);
参数说明
strtoull的三个参数含义:
- 第一个参数:待转换的字符串起始地址,直接传你的字符数组名即可
- 第二个参数:存储转换结束位置的指针,不需要提取转换终止位置时直接传
NULL - 第三个参数:转换的进制数,十六进制固定传16
额外注意点
你现有代码里fscanf(fpAddress, "%s", &addr)的写法存在未定义行为:addr本身已经是数组首地址,不需要额外加取地址符&,改成fscanf(fpAddress, "%s", addr)即可。
MAC地址为48位长度,ULONGLONG是64位无符号整数,存储空间完全足够,不存在数值溢出问题。
内容的提问来源于stack exchange,提问作者Alessandro Chiodo
相关产品推荐
相关产品推荐

