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.rhkb.cn/news/43011.html

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

相关文章

day1_Flink基础

文章目录 Flink基础今日课程内容目标为什么要学Flink技术更新迭代市场需求 流式计算批量计算概念特点 批量计算的优势和弊端流式计算生活中流场景流式计算的概念 Flink简介Flink历史Flink介绍 Flink架构体系已学过的框架技术Flink架构 Flink集群搭建Flink的集群模式Standalone模…

集多功能为一体的软件,支持批量操作。

今天我给大家分享一个超实用的小工具&#xff0c;真的是太好用了&#xff01;这个软件是吾爱大神无知灰灰制作的&#xff0c;它能直接一键把webp格式的图片转换成png格式。 webp转为png 一键操作&#xff0c;支持压缩 其实&#xff0c;作者最近在工作中经常遇到webp格式的图片…

Linux 基本使用和 web 程序部署

目录 Linux 常用命令 ls cd 认识 Linux 目录结构 绝对路径 vs 相对路径 使用 tab 键补全 使用 ctrl c 重新输入 pwd touch cat echo vim 1) 创建文件 / 打开文件 ​编辑 2) 进入插入模式 3) 保存 4) 退出 mkdir rm mv cp man grep ps netstat 搭建 J…

CentOS 7 部署RuoYi 项目

换源 备份现有的 YUM 源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 默认的 CentOS 官方镜像源替换为阿里云的镜像源&#xff0c;以提高下载速度和稳定性。 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.co…

【Kafka】分布式消息队列的核心奥秘

文章目录 一、Kafka 的基石概念​主题&#xff08;Topic&#xff09;​分区&#xff08;Partition&#xff09;​生产者&#xff08;Producer&#xff09;​消费者&#xff08;Consumer&#xff09;​ 二、Kafka 的架构探秘​Broker 集群​副本机制​ 三、Kafka 的卓越特性​高…

linux课程学习二——缓存

一.文件io与标准io的一个区别 遇到死循环可以ctrl c结束进程 使用printf输出&#xff0c;输出没有问题 用wirte输出&#xff0c;参数1&#xff0c;可以理解为上面介绍的linux标准文件描述符的1&#xff08;STDOUT&#xff09;标准输出&#xff0c;我们加上一个死循环while&…

【区块链安全 | 第九篇】基于Heimdall设计的智能合约反编译项目

文章目录 背景目的安装1、安装 Rust2、克隆 heimdall-dec3、编译 heimdall-dec4、运行 heimdall-dec 使用说明1、访问 Web 界面2、输入合约信息3、查看反编译结果 实战演示1、解析普通合约2、解析代理合约 背景 在区块链安全研究中&#xff0c;智能合约的审计和分析至关重要。…

CANoe入门——CANoe的诊断模块,调用CAPL进行uds诊断

目录 一、诊断窗口介绍 二、诊断数据库文件管理 三、添加基础诊断描述文件&#xff08;若没有CDD/ODX/PDX文件&#xff09;并使用对应的诊断功能进行UDS诊断 3.1、添加基础诊断描述文件 3.2、基于基础诊断&#xff0c;使用诊断控制台进行UDS诊断 3.2.1、生成基础诊断 3.…

关于embedding向量模型的知识

环境&#xff1a; embedding 问题描述&#xff1a; 关于embedding向量模型的知识 解决方案&#xff1a; 向量模型基础 定义与本质&#xff1a;embedding向量模型是一种将离散数据&#xff08;如文本、图像、用户行为等&#xff09;映射到连续向量空间的技术。其核心思想是…

Docker远程访问与加密配置指南

实验目的 基础功能验证&#xff1a; 验证Docker远程访问的基础配置方法 测试未加密(2375端口)和TLS加密(2376端口)两种连接方式的可用性安全性对比&#xff1a; 对比防火墙开启/关闭状态下系统的暴露风险 分析未加密通信的数据传输安全性 验证TLS证书认证机制的有效性操作实践…

基于 Python 深度学习 lstm 算法的电影评论情感分析可视化系统(2.0 系统全新升级,已获高分通过)

大家好&#xff0c;欢迎来到我的技术专栏&#xff01;今天我将和大家聊聊如何利用 Python 的深度学习技术&#xff0c;打造一个集电影评论情感分析与可视化展示于一体的系统。这个系统不仅能自动采集和解析海量影评&#xff0c;还能实时生成直观的情感趋势图表&#xff0c;对于…

pytorch中dataloader自定义数据集

前言 在深度学习中我们需要使用自己的数据集做训练&#xff0c;因此需要将自定义的数据和标签加载到pytorch里面的dataloader里&#xff0c;也就是自实现一个dataloader。 数据集处理 以花卉识别项目为例&#xff0c;我们分别做出图片的训练集和测试集&#xff0c;训练集的标…

业之峰与宏图智能战略携手,开启家装数字化新篇章

3月8日&#xff0c;业之峰装饰集团董事长张钧携高管团队与宏图智能董事长庭治宏及核心团队&#xff0c;在业之峰总部隆重举行了战略合作签约仪式&#xff0c;标志着双方将携手探索业之峰的数字化转型之路&#xff0c;共同推动家装行业的变革与发展。 近年来&#xff0c;家装行业…

区块链赋能,为木材货场 “智” 造未来

区块链赋能&#xff0c;为木材货场 “智” 造未来 在当今数字化浪潮席卷的时代&#xff0c;软件开发公司不断探索创新&#xff0c;为各行业带来高效、智能的解决方案。今天&#xff0c;让我们聚焦于一家软件开发公司的杰出成果 —— 区块链木材货场服务平台&#xff0c;深入了…

Suricata 检测日志中的时间戳不正确

参考连接 Incorrect Timestamp in Suricata Detection Logs - Help - Suricata 问题现象&#xff1a; 使用 Suricata 时遇到一个问题&#xff0c;即检测日志 &#xff08;eve.json&#xff09; 中的 and 字段间歇性地显示 2106 年。这似乎偶尔发生&#xff0c;并影响其中一个…

【第34节】windows原理:PE文件的导出表和导入表

目录 一、导出表 1.1 导出表概述 1.2 说明与使用 二、导入表 2.1 导入表概述 2.2 说明与使用 一、导出表 1.1 导出表概述 &#xff08;1&#xff09;导出行为和导出表用途&#xff1a;PE文件能把自身的函数、变量或者类&#xff0c;提供给其他PE文件使用&#xff0c;这…

【计算机网络】深入解析TCP/IP参考模型:从四层架构到数据封装,全面对比OSI

TCP/IP参考模型 导读一、历史背景二、分层结构2.1 网络接口层&#xff08;Network Interface Layer&#xff09;2.2 网络层&#xff08;Internet Layer&#xff09;2.3 传输层&#xff08;Transport Layer&#xff09;2.4 应用层&#xff08;Application Layer&#xff09; 三、…

项目实战-角色列表

抄上一次写过的代码&#xff1a; import React, { useState, useEffect } from "react"; import axios from axios; import { Button, Table, Modal } from antd; import { BarsOutlined, DeleteOutlined, ExclamationCircleOutlined } from ant-design/icons;const…

LeetCode1两数之和

**思路&#xff1a;**懒得写了&#xff0c;如代码所示 /*** Note: The returned array must be malloced, assume caller calls free().*/ struct hashTable {int key;//存值int val;//存索引UT_hash_handle hh; }; int* twoSum(int* nums, int numsSize, int target, int* re…

去噪算法大比拼

目录 效果图: 实现代码: 密集抖动 pip install pykalman 效果图: 实现代码: import numpy as np import cv2 import matplotlib.pyplot as plt from scipy.ndimage import gaussian_filter1d from scipy.signal import butter, filtfilt, savgol_filter from pykalma…