首页 > 解决方案 > 用于程序的 C++ 和头文件压缩的​​ Web 文件字节数组

问题描述

我目前正在尝试一点一点地自学如何为 nodeMCU 编写 WiFi 接口。我使用在 github 和其他不同地方找到的代码作为模板来了解每个部分的工作原理。

我现在被困住了,非常感谢帮助克服这个心理障碍。我花了很多时间开发 html css 和 JavaScript 代码以在我的 Arduino 草图中使用,但是了解此模板如何将 Web 文件上传到 SPIFFS 给我带来了各种问题。

#ifndef webfiles_h

#define webfiles_h

#define USE_PROGMEM_WEB_FILES 

#ifdef USE_PROGMEM_WEB_FILES
const char indexhtml[] PROGMEM = {0x1f, 0x8b, 0x08, 0x08, 0xb6, 0x41, 0xf9, 0x5b, 0x02, 0xff, 0x69, 0x6e,...
#endif

void copyWebFiles(bool force){

#ifdef USE_PROGMEM_WEB_FILES

if(settings.getWebSpiffs()){
if(!SPIFFS.exists(String(F("/web/index.html.gz"))) || force) progmemToSpiffs(indexhtml, sizeof(indexhtml), String(F("/web/index.html.gz")));

}
#endif
}
#endif

上面的代码本质上就是模板所做的。

我想做的是创建我的“webfiles.h”,但我不明白的具体部分是看起来像这样的代码

const char indexhtml[] PROGMEM = {0x1f, 0x8b, 0x08, 0x08, 0xb6, 0x41, 0xf9, 0x5b, 0x02, 0xff, 0x69, 0x6e,...

问题:

如何将压缩的 html 文件转换为字节数组以在带有 progmem 的 webfiles.h 文件中使用

我试过了:

转换为base64,但显然不一样。

标签: c++

解决方案


这些是表示文件字节的十六进制数字。 https://www.tutorialspoint.com/computer_logical_organization/hexadecimal_arithmetic.htm https://www.electronics-tutorials.ws/binary/bin_3.html

0x 前缀表示该数字将被解析为十六进制。0xFF 表示 255,0x100 表示 256 等。我们在打印字节时经常使用它,因为一个字节的最大值是 255 (0xFF),因此您始终可以使用十六进制数字最多使用两个字符来打印一个字节。使用我们正常的 base10 数字,我们必须写出使用三位数字的“255”。这使得格式化更简单。想象一下,你必须一个接一个地打印 6 个字节

十进制:0 255 128 100 200 30

十六进制:00 FF 80 64 C8 1E

看看如何更好地格式化十六进制?您可以使用两个字符来表示任何字节。它们有时可能更难阅读,你只需要习惯它。

要自己生成文件的字节数组,您可以使用工具 HxD 并导出到 C 头文件。 https://mh-nexus.de/en/hxd/

自己创建一个工具来做这件事也非常简单,我不久前用不到 50 行代码就做到了。


推荐阅读