Arduino如何将服务器返回的十六进制字符串转为const unsigned char数组供点阵屏使用
结论
该需求完全可以实现。
原有代码错误原因
- C++为编译型语言,
const unsigned char数组的初始化值必须为编译期可确定的常量,你尝试将运行时从服务器获取的动态字符串直接拼接赋值给const数组的写法不符合语法规则,无法正常运行。 drawBitmap接口参数的const修饰仅代表接口内部不会修改传入的数组内容,你传入运行时生成的普通uint8_t类型数组也可正常调用,不需要强制使用const类型数组。
实现步骤
- 根据位图的宽高计算总字节数,提前开辟对应大小的
uint8_t数组作为缓存 - 将服务器返回的逗号分隔十六进制字符串,按逗号、空格分割为单个十六进制文本片段
- 将每个十六进制文本片段转换为对应
uint8_t数值,依次存入缓存数组 - 将填充完成的缓存数组传入
drawBitmap接口即可完成显示
示例代码
// 十六进制字符串转uint8_t数组函数 // 参数:hexStr 输入的逗号分隔十六进制字符串;outBuf 输出缓存数组;bufLen 缓存数组总长度 // 返回值:解析是否成功 bool parseHexBmp(String hexStr, uint8_t* outBuf, int bufLen) { int writePos = 0; // 按逗号+空格分割字符串 char* part = strtok((char*)hexStr.c_str(), ", "); while (part != nullptr && writePos < bufLen) { // 十六进制字符串转数值,自动适配带0x前缀和无前缀的格式 outBuf[writePos++] = (uint8_t)strtol(part, nullptr, 16); part = strtok(nullptr, ", "); } // 校验解析后的字节数是否和预期一致 return writePos == bufLen; } // 业务调用示例 void displayBmpFromServer(String serverBmpStr, int startX, int startY, int bmpWidth, int bmpHeight) { // 计算位图总字节数,1bit per pixel的位图计算公式为 宽度*高度/8,根据你实际位图色深调整 int bmpTotalBytes = bmpWidth * bmpHeight / 8; // 开辟缓存,如果字节数较大建议改用malloc动态申请内存 uint8_t bmpBuf[bmpTotalBytes]; if (parseHexBmp(serverBmpStr, bmpBuf, bmpTotalBytes)) { // 解析成功,调用显示接口 display.drawBitmap(bmpBuf, startX, startY, bmpWidth, bmpHeight, GxEPD_WHITE); } }
注意事项
- 提前确认位图的色深和总字节数,避免缓存大小不足导致数组越界
- 如果位图尺寸较大,栈内存不足时可改用
uint8_t* bmpBuf = (uint8_t*)malloc(bmpTotalBytes)申请堆内存,使用完成后调用free(bmpBuf)释放内存避免泄漏 - 服务器返回的字符串如果有多余的首尾空格、换行符,建议先做trim处理后再传入解析函数,避免解析错误
内容的提问来源于stack exchange,提问作者Coder06
相关产品推荐
相关产品推荐

