当前位置: 首页 > news >正文

C语言二进制数据和16进制字符串互转

知识点:结构体中的“伸缩型数组成员”(C99新增)

C99新增了一个特性:伸缩型数组成员(flexible array member),利用这项特性声明的结构,其最后一个数组成员具有一些特性。第1个特性是,该数组不会立即存在。第2个特性是,使用这个伸缩型数组成员可以编写合适的代码,就好像它确实存在并具有所需数目的元素一样。声明一个伸缩型数组成员有如下规则:
(1) 伸缩型数组成员必须是结构的最后一个成员;
(2) 结构中必须至少有一个成员;
(3) 伸缩数组的声明类似于普通数组,只是它的方括号中是空的。

data_util.h

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>struct byte_array {int length;//// 术语“伸缩型数组成员”(C99新增),必须是结构体的最后一个成员,sizeof 对结构体运算获得的大小不包含该成员,// 使用 malloc 分配内存的时候需要额外计算“伸缩型数组”的大小//uint8_t data[];
};typedef struct byte_array ByteArray;//
// 参数是带空格的16进制字符串,如 "11 AA BB"
//
ByteArray* hex_to_data(const char* hex_str);const char* data_to_hex(const ByteArray* arr);

data_util.c

#include "data_util.h"ByteArray* hex_to_data(const char* hex_str) {printf("%s\n", hex_str);int length = (strlen(hex_str) + 1) / 3;ByteArray* arr_ptr = malloc(sizeof(ByteArray) + length);arr_ptr->length = length;int i = 0;int byte;while (sscanf(hex_str + (i * 3), "%02x", &byte)) {//printf("byte%d=%02x\n", i, byte);arr_ptr->data[i++] = byte;if (hex_str[i * 3] == '\0') {break;}}return arr_ptr;
}const char* data_to_hex(const ByteArray* arr) {int length = arr->length;char* hex_str = malloc(length * 3);char buf[4];for (int i = 0; i < length; i++){sprintf(buf, "%02X ", arr->data[i]);strncpy(hex_str + i * 3, buf, 3);}hex_str[length * 3 - 1] = '\0';return hex_str;
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "data_util.h"int main(int argc, char* argv[])
{char * hex_str = "03 22 AB AB 55 55 55 55";ByteArray* arr = hex_to_data(hex_str);printf("len=%d\n", arr->length);hex_str = data_to_hex(arr);printf("data=[%s]\n", hex_str);free(arr);free(hex_str);printf("按 Enter 键退出");getchar();
}

http://www.lryc.cn/news/107506.html

相关文章:

  • 技术复盘(5)--git
  • GDAL C++ API 学习之路 (5) Spatial Reference System篇 OGRSpatialReference类
  • 2023年华数杯数学建模C题思路代码分析 - 母亲身心健康对婴儿成长的影响
  • WebAgent-基于大型语言模型的代理程序
  • 智慧~经典开源项目数字孪生智慧商场——开源工程及源码
  • LeetCode--剑指Offer75(1)
  • C++ 关于大端模式和小端模式的简析
  • 嵌入式:C高级 Day2
  • iPhone 7透明屏的显示效果怎么样?
  • 【C++】—— 多态常见的笔试和面试问题
  • 探寻AI大模型平台之巅——文心千帆
  • 【springboot】RestTemplate配置HttpClient连接池
  • MySQL内置函数使用说明
  • java后端富文本转word,再传递到浏览器下载。
  • 【动态规划算法】-回文串问题题型(34-40题)
  • STM32基础回顾
  • 如何解决电脑无声问题:排除故障的几种常见方法
  • Apache RocketMQ 命令注入
  • 二、搜索与图论6:Dijkstra 模板题+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency)
  • ROS2学习(四)进程,线程与节点的关系
  • 【物联网】DMA传输原理与实现详解(超详细)
  • Java类集框架(二)
  • 爬虫008_流程控制语句_if_if else_elif_for---python工作笔记026
  • 【随笔】五周年创作纪念日
  • 7_分类算法—逻辑回归
  • 【计算机网络】应用层协议 -- DNS协议
  • ES6 - 数组新增的一些常用方法
  • 【BEV感知】3-BEV开源数据集
  • Kafka-Broker工作流程
  • 第八篇-Tesla P40+ChatGLM2+LoRA