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.pswp.cn/diannao/76030.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76030.shtml
英文地址,請注明出處:http://en.pswp.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…