You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言如何将0X前缀十六进制字符数组转换为ULONGLONG类型MAC地址

错误原因

你直接用(unsigned long long)prefixAddr1强转拿到乱码是核心概念错误:prefixAddr1是字符数组,直接强转得到的是数组在内存中的首地址,和字符串本身代表的十六进制数值没有任何关系,内存地址是程序运行时随机分配的,自然输出乱码。

正确实现方案

使用C标准库提供的strtoull函数即可完成十六进制字符串到unsigned long long(对应Windows定义的ULONGLONG)的转换,该函数会自动识别字符串开头的0X/0x十六进制前缀,不需要手动截断前缀处理,转换结果和你手动写十六进制字面量赋值的效果完全一致。

实现步骤

  1. 首先引入对应头文件:
    #include <stdlib.h>
    
  2. 在你完成字符串拼接、得到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:24:23