C语言使用stream完成协议封送

开发过程中,对于自定义协议的打包,可以借助stream完成。

stream.h

#pragma once#include <stdio.h>
#include <string.h>typedef struct stream
{char   d[256];size_t size;size_t len;size_t pos;
} stream, *pstream;void stem_init(pstream s);
void stem_push(pstream s, void *value, size_t vsize, int flip);
void stem_dump(pstream s, FILE *f);#define stem_push_func(type) \
inline void stem_push_##type(pstream s, type v, int flip) \
{ stem_push(s, &v, sizeof(v), flip); }#define stem_push_func_i(type) \
stem_push_func(type) \
inline void stem_push_u##type(pstream s, unsigned type v, int flip) \
{ stem_push(s, &v, sizeof(v), flip); }stem_push_func_i(char)
stem_push_func_i(short)
stem_push_func_i(int)
stem_push_func(float)
stem_push_func(double)inline void stem_push_string(pstream s, const char *str)
{stem_push(s, (void*)str, strlen(str), 0);
}

stream.c

#include <assert.h>
#include <memory.h>
#include "stream.h"void stem_init(pstream s)
{s->size = 256;s->len = s->pos = 0;memset(s->d, 0, s->size);
}void stem_push(pstream s, void *value, size_t vsize, int flip)
{assert(s);assert(vsize <= s->size - s->pos);if (!flip){memcpy(s->d + s->pos, value, vsize);}else{char *pe = (char*)value + vsize;switch (vsize){case 1:*(s->d + s->pos + 0) = *--pe;break;case 2:*(s->d + s->pos + 0) = *--pe;*(s->d + s->pos + 1) = *--pe;break;case 4:*(s->d + s->pos + 0) = *--pe;*(s->d + s->pos + 1) = *--pe;*(s->d + s->pos + 2) = *--pe;*(s->d + s->pos + 3) = *--pe;break;case 8:*(s->d + s->pos + 0) = *--pe;*(s->d + s->pos + 1) = *--pe;*(s->d + s->pos + 2) = *--pe;*(s->d + s->pos + 3) = *--pe;*(s->d + s->pos + 4) = *--pe;*(s->d + s->pos + 5) = *--pe;*(s->d + s->pos + 6) = *--pe;*(s->d + s->pos + 7) = *--pe;break;default:for (size_t i = 0; i < vsize; i++){memcpy(s->d + s->pos + i, --pe, 1);}break;}}s->len += vsize;s->pos += vsize;
}void stem_dump(pstream s, FILE *f)
{if (s->len){for (size_t i = 0; i < s->len; i++)fprintf(f, "%02x ", (unsigned char)s->d[i]);fprintf(f, "\n");}else{fputs("stream:[]", f);}
}

main.c

#include "stream.h"int main()
{stream s;stem_init(&s);stem_push_char(&s, 'a', 0);stem_push_uchar(&s, 'b', 0);stem_push_short(&s, -1234, 0);stem_push_ushort(&s, 4455, 0);stem_push_int(&s, 0xAABBCCDD, 1);stem_push_uint(&s, 0xAABBCCDD, 0);stem_push_float(&s, 3.14f, 0);stem_push_double(&s, 6.155, 0);stem_push_string(&s, "hello, world!");stem_dump(&s, stdout);int x = 0xDDCCBBAA;unsigned int ux = 0xAABBCCDD;printf("\n");printf("x: %d\n", x);printf("ux: %u\n", ux);printf("\n");printf("char: %c\n", *(s.d + 0));printf("uchar: %c\n", *(s.d + 1));printf("short: %d\n", *(short*)(s.d + 2));printf("ushort: %d\n", *(unsigned short*)(s.d + 4));printf("int: %i\n", *(int*)(s.d + 6));printf("uint: %u\n", *(unsigned int*)(s.d + 10));printf("float: %f\n", *(float*)(s.d + 14));printf("doulbe: %f\n", *(double*)(s.d + 18));printf("string: %s\n", (s.d + 26));
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Window 安装ack 搜索软件 及使用

1. 先安装 PowerShell 命令行工具 2. 通过该工具安装命令行包管理器工具 Chocolatey 命令&#xff1a; Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManager]::SecurityProtocol -bor …

基于SSM的社区物业管理系统+LW参考示例

1.项目介绍 系统角色&#xff1a;管理员、业主&#xff08;普通用户&#xff09;功能模块&#xff1a;管理员&#xff08;用户管理、二手置换管理、报修管理、缴费管理、公告管理&#xff09;、普通用户&#xff08;登录注册、二手置换、生活缴费、信息采集、报事报修&#xf…

ubuntu中安装mysql

一、注意版本问题 ubuntu常用的版本是16.4&#xff0c;18.4,对应的mysql文件也不同&#xff0c;注意不要下载错误。 二、注意更换apt的源 sudo cat /etc/apt/sources.list查看现在的数据源&#xff0c;我更换了阿里的数据源。更换语句如下&#xff1a; sed -i s/http:\/\/…

2024数据库国测揭晓:安全与可靠的新标准,你了解多少?

2024年数据库国测的结果&#xff0c;于9月份的最后一天发布了。 对于数据库行业的从业者来说&#xff0c;国测是我们绕不过去的坎儿。那么什么是国测&#xff1f;为什么要通过国测&#xff0c;以及国测的要求有哪些&#xff1f; 这篇文章带大家一探究竟。 国测 自愿平等、客…

Ubuntu - 进入紧急模式,无法进入桌面

目录 一、问题 二、分析原因 三、解决 四、参考 一、问题 重新安装VMVare之后&#xff0c;将之前的虚拟机加载不进来 二、分析原因 查看系统错误日志 journalctl -xb | grep Failed mnt挂载找不到了 三、解决 查看系统错误日志 如果是磁盘错误&#xff0c;此时终端会有…

基于STM32的八位数码管显示Proteus仿真设计

基于STM32的八位数码管显示Proteus仿真设计 1.主要功能2.仿真设计3. 程序设计4. 设计报告5. 资料清单&下载链接 基于STM32的八位数码管显示Proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;…

数据库管理-第257期 有好故事才能讲好故事(20241101)

数据库管理257期 2024-11-01 数据库管理-第257期 有好故事才能讲好故事&#xff08;20241101&#xff09;1 23c到23ai2 惊艳的APEX3 愿景到实现总结 数据库管理-第257期 有好故事才能讲好故事&#xff08;20241101&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文…

FreeRTOS 队列详解

目录 一、引言 二、FreeRTOS 队列的基本概念 1.定义与作用 2.队列的长度和数据大小 三、FreeRTOS 队列的特点 1.先进先出&#xff08;FIFO&#xff09;特性 2.值传递方式 3.多任务访问 4.阻塞机制 四、FreeRTOS 队列的操作方法 1.创建队列 2.写队列&#xff08;发送…

Java项目实战II基于Spring Boot的问卷调查系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导 一、前言 在当今信息爆炸的时代&#xff0c;问卷调查…

基于JavaWeb的宿舍管理系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

EPSON机械手与第三方相机的校准功能设计By python

EPSON机械手与第三方相机的校准功能设计By python 使用Python来实现EPSON机械手与第三方相机的校准功能是一个复杂但可行的任务。这通常涉及以下几个步骤:硬件接口通信、图像处理、标定算法实现和控制逻辑编写。 1. 环境准备 首先,库 pip install numpy opencv-python pyse…

【电子通识】白皮书、应用手册、用户指南、快速入门指南一般的定义是什么?

一般大厂家的器件或模块,除了给数据表以外,还提供应用手册、技术说明、白皮书等各种文档资料。 如下图所示为ST25 NFC/RFID标签和读卡器的文件资料:其中就有技术说明、白皮书、应用手册等。 如下所示为TI INA228技术文档相关资料: 也有应用手册、用户指南、技术文章…

【真实对抗环境】MC-Net: Realistic Sample Generation for Black-Box Attacks

原文标题&#xff1a; MC-Net: Realistic Sample Generation for Black-Box Attacks 原文代码&#xff1a; https://github.com/jiaokailun/A-fast 发布年度&#xff1a; 2024 发布期刊&#xff1a; TIFS 目录 摘要背景创新点模型实验结论 摘要 One area of current research …

0-基于图的组合优化算法学习(NeurIPS 2017)(未完)

文章目录 Abstract1 Introduction2 图上的贪婪算法的通用表述Abstract 为NP-hard组合优化问题设计好的启发式或近似算法通常需要大量的专业知识和试错。我们能否自动化这个具有挑战性、乏味的过程,而不是学习算法呢?在许多实际应用中,通常是相同的优化问题一次又一次地被解…

ctfshow(316)--XSS漏洞--反射性XSS

Web316 进入界面&#xff1a; 审计 显示是关于反射性XSS的题目。 思路 首先想到利用XSS平台解题&#xff0c;看其他师傅的wp提示flag是在cookie中。 当前页面的cookie是flagyou%20are%20not%20admin%20no%20flag。 但是这里我使用XSS平台&#xff0c;显示的cookie还是这样…

AI 大模型重塑软件开发流程

一、AI 大模型的定义 AI 大模型是指具有大量参数和复杂结构的人工智能模型&#xff0c;通过在大规模数据上进行训练&#xff0c;可以学习到丰富的知识和模式。这些模型通常基于深度学习技术&#xff0c;如神经网络&#xff0c;能够处理自然语言、图像、音频等多种类型的数据&am…

LeetCode 3216. 交换后字典序最小的字符串[简单]

. - 力扣&#xff08;LeetCode&#xff09; 题目 给你一个仅由数字组成的字符串 s&#xff0c;在最多交换一次 相邻 且具有相同 奇偶性 的数字后&#xff0c;返回可以得到的字典序最小的字符串。 相同奇偶性&#xff1a;如果两个数字都是奇数或都是偶数&#xff0c;则它们具…

建筑行业员工离职SOP的数字化管理

在建筑行业&#xff0c;随着数字化转型的深入&#xff0c;对员工离职的标准操作程序&#xff08;SOP&#xff09;进行数字化管理变得尤为重要。这不仅有助于提高管理效率&#xff0c;还能确保离职流程的规范性和合规性。本文将探讨建筑行业如何通过数字化手段管理员工离职SOP&a…

【你也能从零基础学会网站开发】 SQL Server结构化查询语言数据操作应用--DML篇 浅谈SQL JOIN多表查询之FULL JOIN 全连接查询

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 FULL JOIN 全连…

高效数据集成:从旺店通到金蝶云

高效数据集成&#xff1a;从旺店通到金蝶云 旺店通旗舰奇门数据集成到金蝶云星空&#xff1a;柏为销售出库单07.25 在现代企业的运营中&#xff0c;数据的高效流转和准确对接是确保业务顺畅运行的关键。本文将分享一个实际案例——如何通过轻易云数据集成平台&#xff0c;将旺…