Arduino中将String类型十六进制字符串转换为const unsigned char实现位图显示
需求完全可以实现,首先先明确你之前写法错误的核心原因:
- 直接对
abc.c_str()做强制类型转换,本质是把字符串的ASCII编码内存地址直接传给接口,你读到的是'0'、'x'、'f'这类字符的ASCII值,不是你需要的0xff数值,所以会出现黑屏。 - 第一次数组初始化报错是因为你把指针类型赋值给了
unsigned char类型的数组元素,类型不匹配。 - 运行时拼接字符串塞入常量初始化的写法不符合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
相关产品推荐
相关产品推荐

