
Serial Studio Base64 解码模板详解将 Base64 遥测帧逐字节解析为十进制通道【免费下载链接】Serial-StudioOpen-source telemetry dashboard. Supports UART, BLE, MQTT, Modbus, CAN Bus and more.项目地址: https://gitcode.com/GitHub_Trending/se/Serial-StudioBase64-encoded dataBase64 编码数据是 Serial Studio 内置的解析模板之一用于将 Base64 编码的遥测载荷解码为每字节一个的十进制通道取值 0–255。本文以 app/rcc/scripts/native/base64_encoded.md 为核心结合仓库中的原生 C 解析器、Lua/JavaScript 参考实现与解析器管线源码完整讲解其线缆格式、解析原理、参数约束、输出通道及在项目编辑器中的接入方式帮助你快速将这类数据源接入 Serial Studio 的仪表盘、表格与图表。一、模板定位解码器与解析器的组合在 Serial Studio 的数据流中一帧原始数据要经过两个阶段才能真正成为可显示的通道值解码器Decoder负责把线缆上的原始字节转换为文本表示解析器Parser / Native Template负责从文本中提取出有意义的通道值。Base64 模板属于后者但它与解码器有明确的配合关系。在 BinaryBase64.cpp 中模板的官方描述明确指出Decodes a Base64 payload into one decimal channel per byte. Use with the Base64 decoder.也就是要求在使用本模板时项目编辑器中应选择Base64解码器。这一点在 FrameParserPipeline.cpp 中也有印证管线内部维护了一个DecoderMethod枚举SerialStudio.h 定义了Base64等解码方式帧数据先经decoderRepresentation()得到解码后的文本表示再交给解析引擎处理。因此Base64 模板实际上接收的是已被 Base64 解码器还原出来的字符串随后逐字节拆分为通道。二、线缆格式与工作示例该模板的输入是标准的 Base64 编码字符串模板文档给出的线缆格式示例如下SGVsbG8这一字符串对应 ASCII 文本Hello。模板会把它解码为 5 个字节并输出 5 个十进制通道值通道序号字节值十进制对应 ASCII 字符172H2101e3108l4108l5111o也就是说SGVsbG8被解码为72, 101, 108, 108, 111。这一行为在三套实现中完全一致Lua 参考实现 base64_encoded.lua 的注释给出了同样的示例SGVsbG8gV29ybGQ即Hello World解码为{72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100}JavaScript 参考实现 base64_encoded.js 的注释也声明了相同的输入输出格式。注意这里每字节一个通道中的字节是解码后的二进制字节而不是 Base64 字符本身。通道数量等于解码后数据的总字节数。三、参数说明零参数模板该模板没有任何参数。在 BinaryBase64.cpp 中模板描述符的params()方法直接返回空列表makeParser()也忽略传入的参数对象并返回一个默认的Base64Parser实例[[nodiscard]] QListNativeParamSpec params() const override { return {}; } [[nodiscard]] std::unique_ptrINativeParser makeParser(const QJsonObject params, QString error) const override { Q_UNUSED(params) Q_UNUSED(error) return std::make_uniqueBase64Parser(); }因此在使用时你无需也无法配置任何参数模板会以固定策略工作解码整个输入帧、逐字节输出。模板的稳定标识符为base64_encoded这一定义同样体现在 BinaryBase64.cpp 的id()方法中并与 templates.json 注册表条目一一对应。四、输出通道每字节一个十进制值模板对每个解码后的字节生成一个通道按顺序排列取值范围固定为 0–255十进制。这意味着通道数量 解码后数据的字节数每个通道的语义是该字节的数值而非字符或十六进制通道顺序与解码后字节顺序一致方便你直接在项目编辑器中按顺序绑定仪表、表格或图表。Lua 实现 base64_encoded.lua 的核心逻辑展示了这一点——它维护一个 6 位累积缓冲每凑满 8 位就产出一个字节bit.band(bit.rshift(buffer, bits), 0xFF)。JavaScript 实现 base64_encoded.js 则通过Array.from(binaryString).map(char char.charCodeAt(0))将每个解码字符映射为其 0–255 的码值。两套脚本都从每 6 位取一个 Base64 字符、每 8 位输出一个字节的 Base64 基本原理出发最终结果一致。五、解析器管线中的实现细节在原生Native路径下该模板由 BinaryBase64.cpp 中的Base64Parser类实现它针对不同输入形态提供了三个入口入口方法处理方式parseText(const QString frame)将文本帧去除首尾空白后直接QByteArray::fromBase64()解码parseBinary(const QByteArray frame)将二进制帧视为 Base64 文本本身转成 Latin-1 文本后再走parseTextparseUtf8(const QByteArray frame)直接对 UTF-8 字节序列做fromBase64()解码省去文本往返三个入口最终都通过byteRowFrame(decoded)将解码后的字节数组包装成通道行。关键行为是解码前会先trimmed()去掉帧首尾的空白字符容忍数据源附带换行或空格若解码结果为空decoded.isEmpty()则返回空结果不产生任何通道无效的 Base64 输入不会输出部分结果而是整体静默丢弃。关于无效输入产生空输出这一行为模板文档Pipeline Notes与源码完全一致文档明确写道Invalid Base64 input produces no output而源码中fromBase64()返回空数组时直接return {}。六、模板注册与多语言支持Base64 模板通过 templates.json 注册到解析器模板目录中该注册表为每个模板维护了稳定的file标识、显示名称以及 18 种语言的本地化名称。其中简体中文名称为Base64 编码数据英文名称为 Base64-encoded data。模板的实际可用性由原生 C 描述符BinaryBase64.h 中声明的DataModel::base64Template()与脚本目录Lua/JavaScript 参考实现共同保障无论你使用哪种解析引擎都能获得一致的解析语义。七、在项目编辑器中接入 Base64 模板要在 Serial Studio 项目中使用该模板建议按以下步骤操作新建或打开一个串口/网络/MQTT 等数据源确认该数据源会输出 Base64 编码的文本帧在项目编辑器中创建解析器选择Base64-encoded dataBase64 编码数据模板为数据源选择 Base64 解码器Pipeline Notes 明确要求 Select theBase64decoder确保原始帧先被还原为 Base64 字符串再交给解析器绑定输出通道模板会自动生成每字节一个的十进制通道将其依次映射到仪表、表格、图表等输出控件运行并验证以帧SGVsbG8为例预期应看到 72、101、108、108、111 五个通道值。八、适用场景与边界Base64 模板适合所有设备端先把二进制载荷编码成 Base64 文本再上送的遥测链路例如嵌入式设备通过串口输出base64(sensor_batch)的场景或云网关在 MQTT/网络帧中携带 Base64 载荷的场景。结合仓库中的脚本参考实现你还可以参考 base64_encoded.lua 与 base64_encoded.js 的写法理解如何在一个parse(frame)函数中完成同样的逐字节解码。需要特别注意的是边界行为任何无效的 Base64 输入都会导致本帧不产生任何输出且模板不做部分解码、不输出错误通道。因此如果你的数据源偶尔会发出损坏的帧应在设备端或网关侧先行保证 Base64 数据的合法性再交由 Serial Studio 解析。九、相关参考文件模板文档app/rcc/scripts/native/base64_encoded.md原生 C 实现BinaryBase64.cpp 与 BinaryBase64.hLua 参考实现base64_encoded.luaJavaScript 参考实现base64_encoded.js模板注册表含多语言名称templates.json解码器与解析器管线FrameParserPipeline.cpp解码方式枚举定义SerialStudio.h【免费下载链接】Serial-StudioOpen-source telemetry dashboard. Supports UART, BLE, MQTT, Modbus, CAN Bus and more.项目地址: https://gitcode.com/GitHub_Trending/se/Serial-Studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考