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

CAPL脚本开发求助:字符串转十六进制实现问题

CAPL脚本:将十六进制字符串转换为数值的修正方案

你的代码存在几个关键问题,导致无法正确转换,以下是问题分析和修正方案:

问题点梳理

  • 内层循环变量错误:内层循环中误用i++代替j++,导致循环逻辑混乱,无法正常遍历字符
  • strtoul函数参数误用:CAPL中strtoul的原型是dword strtoul(char *s, char **endptr, int base),你缺少了第三个参数(指定进制),且用char类型接收返回值会截断数据
  • 冗余内层循环:数组中每个元素是完整的十六进制字符串(如"0815"),不需要逐个字符遍历转换
  • 未初始化变量:length变量被注释后未赋值,输出的长度值无意义

修正后的代码(整体字符串转数值)

includes
{
  #include "Encoding.cin"
}

variables 
{
 char EcuInfoMFL[2][20] = {"0815","508"};
}

on key 'p'
{
  int i;
  long length;
  dword convertedValue;
  char *endPtr;
  
  for(i = 0; i < elcount(EcuInfoMFL); i++)
  {
    length = strlen(EcuInfoMFL[i]);
    // 第三个参数16指定按十六进制解析字符串
    convertedValue = strtoul(EcuInfoMFL[i], &endPtr, 16);
    write("原字符串: %s, 长度: %d, 转换后(十六进制): %X, 转换后(十进制): %u", 
          EcuInfoMFL[i], length, convertedValue, convertedValue);
  }
}

关键修正说明

  1. 移除了不必要的内层循环,直接遍历数组中的每个十六进制字符串
  2. 正确调用strtoul:通过第三个参数16明确指定按十六进制解析,&endPtr用于捕获转换结束的位置(不需要的话可以传NULL)
  3. 使用dword类型变量接收转换结果,避免char类型的数据截断
  4. 恢复strlen获取字符串长度,输出更清晰的转换信息

可选:逐个字符对转换为十六进制字节

如果你的需求是将字符串拆分为单个十六进制字节(比如"0815"拆为0x08、0x15),可以使用以下代码:

on key 'p'
{
  int i, j;
  char singleByteStr[3]; // 存储两位十六进制字符+结束符
  dword byteValue;
  
  for(i = 0; i < elcount(EcuInfoMFL); i++)
  {
    write("处理字符串: %s", EcuInfoMFL[i]);
    // 每次遍历两个字符,对应一个十六进制字节
    for(j = 0; j < strlen(EcuInfoMFL[i]); j += 2)
    {
      strncpy(singleByteStr, &EcuInfoMFL[i][j], 2);
      singleByteStr[2] = '\0'; // 手动添加字符串结束符
      byteValue = strtoul(singleByteStr, NULL, 16);
      write("  子串: %s -> 十六进制值: %X", singleByteStr, byteValue);
    }
  }
}

内容的提问来源于stack exchange,提问作者A-DnielMR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:21:23