反序列bit

embedded/2024/10/18 10:26:08/

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

// 定义描述反序列化信息的结构体
typedef struct {
const uint32_t *data; // 数据数组
int num_elements; // 数据数组的元素数量
int bit_position; // 当前位偏移量(以位为单位)
} DeserializationContext;

// 从指定的反序列化上下文中按位反序列化指定长度的无符号8位整数,并返回结果
uint8_t deserialize_uint8(DeserializationContext *ctx, int num_bits) {
uint8_t result = 0;
int remaining_bits = num_bits;

while (remaining_bits > 0) {// 当前位置所在的数组元素索引int current_word = ctx->bit_position / 32;// 当前位置在数组元素中的位偏移int start_bit_in_word = ctx->bit_position % 32;// 当前数组元素中可用的位数int available_bits_in_word = 32 - start_bit_in_word;// 需要从当前数组元素中提取的位数int bits_to_copy = (remaining_bits < available_bits_in_word) ? remaining_bits : available_bits_in_word;// 从当前数组元素中提取指定位数的数据,并合并到结果中uint32_t word = ctx->data[current_word];uint32_t extracted_bits = (word >> start_bit_in_word) & ((1 << bits_to_copy) - 1);result |= (extracted_bits << (num_bits - remaining_bits));// 更新剩余需要提取的位数和当前位偏移量remaining_bits -= bits_to_copy;ctx->bit_position += bits_to_copy;// 如果剩余位数大于当前数组元素可用位数,切换到下一个数组元素if (remaining_bits > 0 && bits_to_copy == available_bits_in_word) {ctx->bit_position += start_bit_in_word;  // 跳过当前数组元素剩余位数}
}return result;

}

// 从指定的反序列化上下文中按位反序列化指定长度的有符号8位整数,并返回结果
int8_t deserialize_int8(DeserializationContext *ctx, int num_bits) {
// 反序列化无符号8位整数
uint8_t unsigned_value = deserialize_uint8(ctx, num_bits);

// 对有符号整数进行符号扩展
int8_t signed_value;
if (unsigned_value & (1 << (num_bits - 1))) {// 负数的补码表示,进行符号扩展signed_value = (int8_t)(unsigned_value | (~((1 << num_bits) - 1)));
} else {// 正数或零的补码表示signed_value = (int8_t)unsigned_value;
}return signed_value;

}

// 以下是反序列化其他位数和数据类型的函数,使用类似的方法实现:

uint16_t deserialize_uint16(DeserializationContext *ctx, int num_bits) {
uint16_t result = 0;
int remaining_bits = num_bits;

while (remaining_bits > 0) {// 实现方法类似,直接调用 deserialize_uint8 函数result |= (uint16_t)deserialize_uint8(ctx, remaining_bits) << (num_bits - remaining_bits);remaining_bits -= 8; // 每次处理8位
}return result;

}

int16_t deserialize_int16(DeserializationContext *ctx, int num_bits) {
// 实现方法类似,直接调用 deserialize_int8 函数
return (int16_t)deserialize_int8(ctx, num_bits);
}

uint32_t deserialize_uint32(DeserializationContext *ctx, int num_bits) {
uint32_t result = 0;
int remaining_bits = num_bits;

while (remaining_bits > 0) {// 实现方法类似,直接调用 deserialize_uint8 函数result |= (uint32_t)deserialize_uint8(ctx, remaining_bits) << (num_bits - remaining_bits);remaining_bits -= 8; // 每次处理8位
}return result;

}

int32_t deserialize_int32(DeserializationContext *ctx, int num_bits) {
// 实现方法类似,直接调用 deserialize_int8 函数
return (int32_t)deserialize_int8(ctx, num_bits);
}

uint64_t deserialize_uint64(DeserializationContext *ctx, int num_bits) {
uint64_t result = 0;
int remaining_bits = num_bits;

while (remaining_bits > 0) {// 实现方法类似,直接调用 deserialize_uint8 函数result |= (uint64_t)deserialize_uint8(ctx, remaining_bits) << (num_bits - remaining_bits);remaining_bits -= 8; // 每次处理8位
}return result;

}

int64_t deserialize_int64(DeserializationContext *ctx, int num_bits) {
// 实现方法类似,直接调用 deserialize_int8 函数
return (int64_t)deserialize_int8(ctx, num_bits);
}

int main() {
// 示例 uint32_t 数组(假设包含待反序列化的数据)
const uint32_t data[] = {0xABCD5678, 0x12345678}; // 假设数据数组

// 创建

http://www.ppmy.cn/embedded/15664.html

相关文章

工程问题、科学问题、技术问题是什么意思,有什么联系,有什么区别?我给你们列举几个例子来说明

1.基本介绍 工程问题&#xff1a; 工程问题通常涉及设计、开发、实施和管理实际系统、产品或项目的挑战。这些问题与解决方案的应用息息相关&#xff0c;旨在满足特定需求、达成特定目标或解决实际问题。例如&#xff0c;工程问题可能涉及建筑设计、电气系统优化、机械制造工艺…

WEB攻防-ASP安全-MDB下载

MDB下载漏洞主要涉及到早期ASPAccess构架的数据库文件。当Web站点提供文件下载功能时&#xff0c;如果没有对下载请求进行充分的验证和过滤&#xff0c;或者服务器配置不当&#xff0c;就可能产生文件下载漏洞。攻击者可以利用这个漏洞&#xff0c;通过修改请求参数或尝试猜测或…

创建Maven项目的时候让选择maven模板

创建Maven项目的时候让选择maven模板 心得 工欲利其事 必先利其器。如果你想要干成一件事 那么必须先要精通对应的工具使用。之前我不太注重工具 我觉得只要代码写的好就可以了 但是当我们了解了产品经理的一些思想之后&#xff0c;我才明白一个好的产品是可以给用户提供多大…

Rust-01 Hello Rust 10分钟上手编写第一个Rust程序 背景介绍 发展历史 环境配置 升级打怪的必经之路

背景介绍 Rust 是一种多范式、通用的编程语言&#xff0c;强调性能、类型安全和并发性。它通过一个称为“借用检查器”的机制在编译时追踪所有引用的对象生命周期&#xff0c;以强制实现内存安全&#xff0c;即确保所有引用都指向有效的内存&#xff0c;而不需要垃圾收集器。 …

基于springboot的教学资源库源码数据库

基于springboot的教学资源库源码数据库 社会的进步&#xff0c;教育行业发展迅速&#xff0c;人们对教育越来越重视&#xff0c;在当今网络普及的情况下&#xff0c;教学模式也开始逐渐网络化&#xff0c;各大高校开始网络教学模式。 本文研究的教学资源库系统基于Springboot…

Leetcode 4.21

1.罗马数字转整数 用unordered_map去存罗马数字对应的数值&#xff0c;分情况讨论&#xff0c;把所有情况都列出来即可 class Solution { public:unordered_map<char, int> mp {{I, 1},{V, 5},{X, 10},{L, 50},{C, 100},{D, 500},{M, 1000}};int romanToInt(string s)…

Linux实现文件共享

#nfs-utils、rpcbind 软件包来提供 NFS 共享服务 #客户端创建共享文件夹&#xff1a; nmcli c reload nmcli c up ens160 systemctl stop firewalld systemctl disable firewalld rpm -q nfs-utils rpcbind #查看是否安装 systemctl enable rpcbind systemctl enable nfs…

Web前端开发之HTML_2

HTML5简介与基础骨架标题标签标签之段落、换行、水平线标签之图片标签之超文本链接标签之文本列表标签之有序列表列表标签之无序列表 1. HTML5简介与基础骨架 1.1 HTML5简介 HTML5是用来描述网页的一种语言&#xff0c;被称为超文本标记语言。用HTML5编写的文件&#xff0c;后…