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

Arduino中将String类型十六进制字符串转换为const unsigned char实现位图显示

需求完全可以实现,首先先明确你之前写法错误的核心原因:

  1. 直接对abc.c_str()做强制类型转换,本质是把字符串的ASCII编码内存地址直接传给接口,你读到的是'0'、'x'、'f'这类字符的ASCII值,不是你需要的0xff数值,所以会出现黑屏。
  2. 第一次数组初始化报错是因为你把指针类型赋值给了unsigned char类型的数组元素,类型不匹配。
  3. 运行时拼接字符串塞入常量初始化的写法不符合C++编译逻辑,常量初始化值是编译期确定的,运行时动态生成的字符串没法直接替换。

实现代码(适配Arduino/GxEPD墨水屏场景)

你只需要把String格式的十六进制串按分隔符拆分,逐个转成字节数值即可,示例代码如下:

// 从服务器获取的十六进制字符串
String serverHexStr = "0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff";

// 统计字节数:逗号数量+1即为总字节数
int byteTotal = 1;
for (int i = 0; i < serverHexStr.length(); i++) {
  if (serverHexStr[i] == ',') byteTotal++;
}

// 申请存储字节数组的内存,固定大小位图可直接定义固定长度数组替代动态申请
uint8_t* bmpBuffer = (uint8_t*)malloc(byteTotal * sizeof(uint8_t));
if (bmpBuffer == nullptr) {
  // 内存申请失败的异常处理逻辑可自行补充
  return;
}

// 拆分并转译十六进制串为字节值
char* splitPtr = strtok((char*)serverHexStr.c_str(), ", ");
int bufferIdx = 0;
while (splitPtr != nullptr && bufferIdx < byteTotal) {
  bmpBuffer[bufferIdx] = (uint8_t)strtoul(splitPtr, nullptr, 16);
  bufferIdx++;
  splitPtr = strtok(nullptr, ", ");
}

// 调用接口绘图,bmpBuffer类型天然匹配const unsigned char*要求
display.drawBitmap(bmpBuffer, startX, startY, bmpWidth, bmpHeight, GxEPD_WHITE);

// 释放申请的内存,避免内存泄漏
free(bmpBuffer);

注意事项

  • 如果你的位图分辨率固定,可直接定义对应长度的固定数组替代malloc动态申请,更适合嵌入式低内存场景,避免内存碎片。
  • 需要确保服务器返回的十六进制串分隔符和示例一致,若分隔规则变更,调整strtok的分隔参数即可。
  • 对数据正确性要求高的场景,可在转译时增加合法性校验,过滤异常的十六进制值。

内容的提问来源于stack exchange,提问作者Coder06

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:24:00