用于 progmem 的C++和头文件压缩的 Web 文件字节数组

C++ and header file zipped web files byte array for progmem

本文关键字:文件 Web 字节 字节数 数组 压缩 progmem C++ 用于      更新时间:2023-10-16

我目前正在尝试一点一点地自学如何为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,但显然不一样。

这些是表示文件字节的十六进制数字。 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 行代码中做到了这一点。