bluecode-20240913_1_数据解码

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 256MB,其他语言 512MB
难度:困难

数据解码

指定有一段经过编码的二进制数据,数据由0个或多个"编码单元"组成。"编码单元"的编码方式存在如下两种:

1简单编码单元如下所示,其中:

  • TAG所占长度须为1字节,其值须为0xF0
  • SINGLE-VALUE的长度定为4字节

image.png

2.复杂编码单元如下所示,其中:

  • TAG所占长度须为1字节,其值须为0xF1
  • REPEAT所占长度固定为1字节,用于指示值在解码后消息中重复的次数
  • LEN所占长度固定为4字节,用于指示值的字节数,LEN使用大端序表示
  • 值部分必须由0个或多个"编码单元"组成,且长度必须为LEN字设所指示的字节数

image.png

编码后的数据必须完全符合上述两个原则,不允许有任何冗余的字节,请构造符合上述规则的10个编码:

请根据上述规则对一段编码后的数据进行校验,如果完全符合上述约束则输出解码后的长度,否则输出-1

输入描述

输入一行编码后的二进制数据,按字节16进制表示,如

F0 00 08 09 00

表示一串5字节的编码后数据

输入的字节数n,0<=n<=100000

输出描述

输出解码后的值的字节数,不符合约束返回-1

用例输入 1 

F1 02 00 00 00 05 F0 01 02 03 04

用例输出 1 

8

用例输入 2 

F1 01 00 00 00 04 F0 01 05

用例输出 2 

-1

提示

样例1解释:该码流存在一个复杂编码单元,其中包含一个简单编码单元(内容4字节),复杂编码单元的重复数为2,所以解码后的总长度为8字节

样例2解释:第一个编码单元为复杂编码单元,重复数为1,长度为6,其中的内容从第一个字节开始为一个简单编码单元,但简单编码单元后存在数据0303既不属于简单编码单元,也不属于复杂编码单元,为冗余数据,整体数据不合法,应输出-1

#include <iostream>
#include <vector>
#include <cstdint>using namespace std;// Helper function to parse a single encoding unit
pair<int, int> parseUnit(const vector<uint8_t>& data, int index) {if (index >= data.size()) {return {-1, -1}; // Invalid input}uint8_t tag = data[index];index++;if (tag == 0xF0) {// Simple encoding unit: 1 byte TAG + 4 bytes SINGLE-VALUEif (index + 4 > data.size()) {return {-1, -1}; // Not enough bytes for SIMPLE-VALUE}return {index + 4, 4}; // Move past the SIMPLE-VALUE and return decoded length} else if (tag == 0xF1) {// Complex encoding unit: 1 byte TAG + 1 byte REPEAT + 4 bytes LEN + LEN bytes contentif (index + 5 > data.size()) {return {-1, -1}; // Not enough bytes for REPEAT and LEN}uint8_t repeat = data[index];index++;// Read LEN (4 bytes, big-endian)uint32_t len = 0;for (int i = 0; i < 4; ++i) {len = (len << 8) | data[index++];}// Check if we have enough bytes for the contentif (index + len > data.size()) {return {-1, -1}; // Not enough bytes for the content}// Parse the content recursivelyint contentStart = index;int totalDecoded = 0;while (index < contentStart + len) {auto [newIndex, decodedLen] = parseUnit(data, index);if (newIndex == -1) {return {-1, -1}; // Invalid content}index = newIndex;totalDecoded += decodedLen;}// Ensure no extra bytes in the contentif (index != contentStart + len) {return {-1, -1}; // Extra bytes found}return {index, totalDecoded * repeat};} else {// Invalid TAGreturn {-1, -1};}
}// Main function to decode the length
int decodeLength(const vector<uint8_t>& data) {auto [index, decodedLen] = parseUnit(data, 0);// Ensure all bytes are consumedif (index == static_cast<int>(data.size())) {return decodedLen;} else {return -1; // Redundant bytes found}
}// Helper function to convert hex string to byte array
vector<uint8_t> hexToBytes(const string& hex) {vector<uint8_t> bytes;for (size_t i = 0; i < hex.length(); i += 2) {string byteString = hex.substr(i, 2);uint8_t byte = static_cast<uint8_t>(stoul(byteString, nullptr, 16));bytes.push_back(byte);}return bytes;
}int main() {string hexInput;getline(cin, hexInput);// Remove spaces from the inputstring cleanedInput;for (char c : hexInput) {if (c != ' ') {cleanedInput += c;}}// Convert hex string to byte arrayvector<uint8_t> data = hexToBytes(cleanedInput);// Decode the lengthint result = decodeLength(data);cout << result << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口自动化进阶 —— Pytest全局配置pytest.ini文件详解!

pytest.ini 是 Pytest 的全局配置文件&#xff0c;用于自定义测试运行的行为和规则。通过配置 pytest.ini&#xff0c;可以避免在命令行中重复输入参数&#xff0c;提升测试的效率和一致性。 1. 配置文件的位置和格式 位置&#xff1a;pytest.ini 文件通常放在项目的根目录下。…

ModuleNotFoundError: No module named ‘demjson‘

错误 ModuleNotFoundError: No module named demjson 表明 Python 无法在其环境中找到名为 demjson 的模块。demjson 是一个第三方库&#xff0c;用于在 Python 中编码和解码 JSON 数据。如果你尝试导入它但遇到了这个错误&#xff0c;那很可能是因为你的 Python 环境中没有安装…

1、C51单片机(STC8G2K64S4)串口实验

一、串口1接线图 1、下面是单片机外接电路图&#xff0c;P30,P31分别用于RXD和TXD功能引脚 2、我们来查看单片机手册 串口1需要设置的寄存器 串口1的功能脚配置选择位&#xff0c;看电路图选择的是P3.0,P3.1。 3、串口1&#xff1a;SCON控制寄存器 设置为0x50:0101 0000。&a…

3PL EDI:SA Piper Logistics EDI需求分析

SA Piper Logistics成立于2005年&#xff0c;是一家专注于全球供应链管理的第三方物流服务商&#xff08;3PL&#xff09;&#xff0c;总部位于美国芝加哥。公司以“优化物流效率&#xff0c;重塑供应链价值”为使命&#xff0c;提供仓储管理、运输规划、订单履行及跨境清关等一…

vscode正则表达式使用

小标题 ^\d.\d.\d\s.*$ ^表示匹配字符串的开头。\d\.\d\.\d表示匹配一到多个数字&#xff0c;接着一个小数点&#xff0c;再接着一到多个数字&#xff0c;然后又一个小数点和一到多个数字&#xff0c;用来匹配类似 “2.1.1” 这样的标题号部分。\s表示匹配一个空格。.*表示匹配…

力扣.旋转矩阵Ⅱ

59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09; 代码区&#xff1a; class Solution {const int MAX25; public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> ans;vector<int> hang;int len_nn;int arry[25][25]…

软件工程面试题(十)

1、OSI七层模型tcp四层模型是什么样的 OSI七层参考模型 :物理层 、数据链路层 、网络层 、传输层、应用层、会话层、表示层 TCP/IP:第一层网络接口层第二层 第二层??网间层 第三层??传输层 第四层??应用层 2、JAVA测试模式(ZZ): 模式(一) Main 模式 模式(二)…

淘宝双十一大促监控系统开发:实时追踪爆品数据与流量波动

以下是开发一个淘宝双十一大促监控系统&#xff0c;以实时追踪爆品数据与流量波动的详细步骤及示例代码&#xff1a; 实现思路 数据获取&#xff1a;利用淘宝 API 或者爬虫技术&#xff0c;获取商品的销售数据、浏览量等信息。数据存储&#xff1a;将获取到的数据存储到数据库…

高并发金融系统,“可观测-可追溯-可回滚“的闭环审计体系

一句话总结 在高并发金融系统中&#xff0c;审计方案设计需平衡"观测粒度"与"系统损耗"&#xff0c;通过双AOP实现非侵入式采集&#xff0c;三表机制保障操作原子性&#xff0c;最终形成"可观测-可追溯-可回滚"的闭环体系。 业务痛点与需求 在…

Docker 的实质作用是什么

Docker 的实质作用是什么 目录 Docker 的实质作用是什么**1. Docker 的实质作用****2. 为什么使用 Docker?****(1)解决环境一致性问题****(2)提升资源利用率****(3)简化部署与扩展****(4)加速开发与协作****3. 举例说明****总结**Docker 的实质是容器化平台,核心作用…

【测试】每日3道面试题 3/29

每日更新&#xff0c;建议关注收藏点赞。 自动化测试中的PO模式 page object model POM 是一个设计模式&#xff0c;在自动化测试中将页面元素和操作抽象为对象。具体是将每个页面或页面一部分封装为一个类&#xff0c;包含页面元素和相关操作。 PO 模式不仅适用于 Web 应用的自…

ISIS-4 LSP计算

上一章我们介绍了ISIS的LSDB的形成以及相关实验 这一章我们来介绍ISIS是怎样来计算我们的路由的 1、LSDB数据库 之前我们在ISIS概述里面已经提及到Level-1的路由器设备只会维护Level-1的LSDB Level1-2会维护Level-1以及Level-2的LSDB,Level-2只会维护Level-2的LSDB 2、ATT置…

第7期:生成式AI伦理边界——当技术撞上道德与法律的防火墙

现实版"黑镜"事件 某直播平台主播使用AI换脸技术冒充明星带货&#xff0c;当晚销售额破亿。三天后收到法院传票——这不仅侵犯肖像权&#xff0c;生成的虚假宣传内容还引发大规模消费投诉。这个案例让行业意识到&#xff1a;没有伦理约束的AI&#xff0c;就像没有刹车…

Vue2 使用 v-if、v-else、v-else-if、v-show 以及 v-has 自定义指令实现条件渲染

提示&#xff1a;渲染就是显示 文章目录 前言v-if 的基础用法v-elsev-else-ifv-show 和 v-if 对比自定义指令 v-hasv-if 和 v-has 结合使用场景完整示例补充说明 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 在 Vue2 中&#xff0c;可以通过 v-if 和…

【项目合集】只能xx养殖系统,STM32、esp8266、OLED屏幕、dht11、光敏、水位、加热、风扇

硬件 STM32 主控ESP8266 WIIF 模块烟雾传感器dht11 温湿度传感器光敏传传感器&#xff08;偏暗、亮两种状态&#xff09;水位检测OLED 显示当前状态&#xff08;环境数据&#xff09;加热模块&#xff08;灯代替&#xff09;风扇模块电源模块继电器&#xff08;控制风扇&#…

Java多线程与高并发专题——Condition 和 wait/notify的关系

引入 上一篇关于Condition&#xff0c;我们对Condition有了进一步了解&#xff0c;在之前生产/消费者模式一文&#xff0c;我们讲过如何用 Condition 和 wait/notify 来实现生产者/消费者模式&#xff0c;其中的精髓就在于用Condition 和 wait/notify 来实现简易版阻塞队列&am…

29_项目

目录 http.js 1、先注册账号 register.html 2、再登录 login.html 3、首页 index.html 4 详情 details.html cart.html css index.css register.css details.css 演示 进阶 http.js let baseURL "http://localhost:8888"; let resgiterApi baseURL &…

Next.js 项目生产构建优化

Next.js 项目生产构建优化的完整教程&#xff0c;涵盖配置、工具链和性能调优技巧&#xff0c;助你显著加速 npm run build&#xff1a; 注&#xff1a;学习阶段请先测试环境使用&#xff01; 文章目录 [toc]一、基础优化1. 确保使用最新版本2. 清理无用依赖和代码3. 配置 nex…

【嵌入式学习3】多任务编程

目录 1、多任务 并发&#xff1a;在一段时间内交替去执行任务 并行&#xff1a; 2、线程 进程与线程 守护线程 1、多任务 在同一时间内执行多个任务&#xff0c;多任务分为并发和并行两种形式 并发&#xff1a;在一段时间内交替去执行任务 软件1执行0.01秒&#xff0c;切…

链路聚合(Link Aggregation)

目录 一. 链路聚合概述 1. 基本概念 2. 实现条件 3. 成员接口和成员链路 二. 链路聚合模式 1. 手工模式 2. LACP模式 三. 负载分担 1. 基于数据包的负载分担 2. 基于数据流的负载分担 一. 链路聚合概述 1. 基本概念 链路聚合&#xff08;Link Aggregation&#xff…