反序列bit

#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.mzph.cn/pingmian/3188.shtml

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

相关文章

程序员学习编程新方式:【YDUIbuilder】,让技术触手可及!

想象一下&#xff0c;构建#软件# 就像搭积木一样简单有趣&#xff01;[#YDUIbuilder]#开源项目# 低代码平台&#xff0c;将这一梦想变为现实。这里&#xff0c;创新不再是#程序猿# 的专利&#xff0c;而是每个人的超能力&#xff01; 来[YDUIbuilder]&#xff0c;你将体验到&am…

System1和System2

System 1 和 System 2 是心理学家丹尼尔卡尼曼(Daniel Kahneman)在其著作《快思慢想》(Thinking, Fast and Slow)中描述的两种思维模式。这两个系统代表我们大脑处理信息和做决策的不同方式。 System 1(系统1) 这是我们的“快速思考”系统。它是无意识的、直觉的、自动…

【Qt常用控件】—— QWidget 核心属性

目录 &#xff08;一&#xff09;控件概述 1.1 关于控件体系的发展 &#xff08;二&#xff09;QWidget 核心属性 2.1 核心属性概览 2.2 enabled 2.3 geometry 2.4 windowTitle 2.5 windowIcon 2.6 windowOpacity 2.7 cursor 2.8 font 2.9 toolTip 2.10 focus…

Esko Ukkonen: On-line Construction of Suffix Trees

Esko Ukkonen: On-line Construction of Suffix Trees 文章目录 Esko Ukkonen: On-line Construction of Suffix Trees一、后缀树的概念及应用【详见刘方州同学报告】1.1 字典树 Trie1.2 后缀树 Suffix Tree2 后缀树的应用 二、朴素后缀树构造方法及问题三、线性时间内后缀树在…

怎么办xgp会员一年多少钱xgp会员怎么开轻松教你xgp会员开通教程

怎么办&#xff1f;xgp会员一年多少钱&#xff1f;xgp会员怎么开&#xff1f;轻松教你xgp会员开通教程 XGP平台是由微软公司开发的xbox游戏平台的pc版本&#xff0c;为电脑玩家提供了一个游玩微软游戏的平台&#xff0c;XGP平台因其独特的会员服务而广受玩家们好评&#xff0…

git log 和git reflog命令的区别是什么

git log和git reflog是Git中用于查看仓库历史的两个不同命令&#xff0c;它们各自有不同的用途和显示的信息。 git log git log命令用于显示当前分支的提交历史。它会列出每次提交的SHA-1哈希、作者信息、提交日期和提交信息等。git log提供了许多选项来定制输出的历史记录&a…

《深度学习在医学图像分析中的应用(第二版)》

书籍&#xff1a;Deep Learning for Medical Image Analysis, 2nd Edition 作者&#xff1a;S. Kevin Zhou&#xff0c;Hayit Greenspan&#xff0c;Dinggang Shen 出版&#xff1a;Academic Press书籍下载-《深度学习在医学图像分析中的应用&#xff08;第二版&#xff09;》本…

采用php vue2 开发的一套医院安全(不良)事件管理系统源码(可自动生成鱼骨图)

采用php vue2 开发的一套医院安全&#xff08;不良&#xff09;事件管理系统源码&#xff08;可自动生成鱼骨图&#xff09; 医院安全&#xff08;不良&#xff09;事件管理系统采用无责的、自愿的填报不良事件方式&#xff0c;有效地减轻医护人员的思想压力&#xff0c;以事件…

Linux开发板配置静态IP

1、查看网口信息&#xff0c;易知eth0无IP地址 ifconfig2、首先分配一个IP地址 sudo ifconfig eth0 192.168.5.8 up3、此时配置的IP地址只是临时的&#xff0c;当你reboot重启板子上电后&#xff0c;ip地址会消失&#xff0c;因此需要为板子配置静态ip&#xff0c;避免每次上…

快速排序算法(Python版)

1、什么是快速排序算法 快速排序&#xff08;Quick Sort&#xff09;是一种经典的排序算法&#xff0c;属于比较排序的一种。它的基本思想是通过分治的策略将原始的无序序列划分成较小的子序列&#xff0c;然后分别对这些子序列进行排序&#xff0c;最终合并得到有序的序列。 …

【prometheus学习过程】

目录 一、linux服务器监控常用的监控指标 二、监控docker1、使用CAdvisor2.配置prometheus采集docker的样本数据3.添加触发器3.添加触发器 三、监控MySQL容器1.创建普通用户向数据库授予权限2.Docker部署部署MySQLD Exporter二进制安装mysqld-exporter 四、进程监控1、process …

一次违法网站的渗透经历

0x01 前言 在一次攻防演练中&#xff0c;我发现了一个有趣的渗透路径。在信息收集阶段&#xff0c;我注意到目标网站和用户资产网站共享相同的IP网段。这意味着它们可能在同一台服务器上托管&#xff0c;或者至少由同一家互联网服务提供商管理。这种情况为我们的渗透测试提供了…

System.Exception有哪些类型分别什么意思

在C#中&#xff0c;System.Exception 类是所有异常类的基类。它是处理错误和异常情况的基础。当程序执行期间发生错误时&#xff0c;通常会抛出&#xff08;throw&#xff09;一个异常对象。这个对象随后被捕获&#xff08;catch&#xff09;并处理&#xff0c;或者如果没有被捕…

【window环境、Linux环境、QT三种方法实现TCP通信】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Windows环境下实现TCP通信1.服务器2.客户端3.运行 二、Linux环境下实现TCP通信1.服务端2.客户端 三、Qt实现TCP通信1.服务端1.客户端 总结 前言 大多数项目…

datax与多种数据库间数据类型映射

文章目录 前言一、背景二、映射HiveHBaseMongoDBOraclePostgreSQLSqlServerMysqlODPSOSS 总结 前言 datax内置的enumType数据类型与不同数据库间都有些差异&#xff0c;本文整理出相应的映射关系&#xff0c;在配置自定义json时可以参考做一些类型转换 一、背景 DataX 是阿里…

告别SQL注入攻击之扰!揭秘强大防护策略,筑牢网站安全防线,畅享无忧体验!

SQL注入攻击是一种极具破坏性的Web漏洞&#xff0c;它利用应用程序对用户输入的处理不当&#xff0c;让恶意用户能够执行非授权的SQL查询&#xff0c;进而对数据库造成巨大损害。这种攻击方式可能导致数据泄露、系统崩溃等严重后果&#xff0c;因此必须引起高度重视。 为了有效…

(二)小程序学习笔记——初识:标签、数据绑定、指令介绍

1、rpx&#xff1a;是微信小程序的自适应的单位&#xff0c;根据不同设备的屏幕宽度进行自适应缩放。 2、小程序规定任何型号的手机的屏幕宽度都为 750rpx。 3、小程序中常用的组件&#xff1a;view、swiper&#xff08;滑块视图容器—轮播图的盒子&#xff09;和swipe-item&…

语义分割模型——浅谈U-net相关理论

目录 1 U-net简介 1.1 U-net是什么 1.2 U-net的创新点及优势 2 U-net改进思路 2.1 编码器优化 2.2 跳跃连接优化 2.3 解码器优化 2.4 其他优化方式 2.5 注意事项 1 U-net简介 1.1 U-net是什么 Ronneberger等人于2015年基于FCN&#xff08;全卷积神经网络&#xff09…

预测房屋价格(使用SGDRegressor随机梯度下降回归)

线性回归&#xff1a;预测未来趋势01&#xff08;预测房屋价格&#xff09; 文章目录 线性回归&#xff1a;预测未来趋势01&#xff08;预测房屋价格&#xff09;前言一、案例介绍&#xff1a;二、架构图&#xff1a;&#xff08;流程图&#xff09;三、使用了什么技术&#xf…

代码随想录:二叉树18(Java)

目录 105.从前序与中序遍历序列构造二叉树 题目 代码 106.从中序与后序遍历序列构造二叉树 题目 代码 105.从前序与中序遍历序列构造二叉树 题目 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的…