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

这篇具有很好参考价值的文章主要介绍了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文章来源地址https://www.toymoban.com/news/detail-636259.html

#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();
}

到了这里,关于C语言二进制数据和16进制字符串互转的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构与算法之字符串: Leetcode 696. 计数二进制子串 (Typescript版)

    计数二进制子串 https://leetcode.cn/problems/count-binary-substrings/ 描述 给定一个字符串 s,统计并返回具有相同数量 0 和 1 的非空(连续)子字符串的数量,并且这些子字符串中的所有 0 和所有 1 都是成组连续的。 重复出现(不同位置)的子串也要统计它们出现的次数。 示例 1: 示

    2024年02月01日
    浏览(54)
  • Python字符串与二进制字符串之间的转换

    字符串:可以包含任意字符 二进制字符串:转换结果的长度为8的倍数 涉及的内容: 字符串与bytes类型的互相转换 bytes类转与 list 列表的互相转换 bin函数的使用 int函数的使用 步骤: 将字符串转成bytes类型 将bytes类型转成list类型(元素为int型) 将list的每个元素转成二进制字

    2024年02月13日
    浏览(47)
  • 【Golang】二进制字符串转换为数字

     在本文中,我们将探讨如何使用 Go 语言将十六进制字符串转换为二进制字符串,将不定长整型补码字符串转换为数字,以及如何将 IEEE754 标准的单精度(32位)和双精度(64位)浮点数字符串转换为数字。最后,我们将讨论如何将布尔类型的二进制字符串转换为布尔值。 这

    2024年01月16日
    浏览(57)
  • 【Golang】补码二进制字符串转整型

     在计算机科学中,原码、反码和补码是用来表示有符号整数的三种不同的二进制编码方式。下面将详细解释每一种编码方式的特点和用途。 原码  原码是最直观的有符号数表示方法。在原码表示法中,最高位(符号位)用来表示数的正负,0表示正数,1表示负数。正数的原

    2024年01月21日
    浏览(70)
  • java案例5-4 字符串转换为二进制

    本例要求编写一个程序,从键盘录入一个字符串,将字符串转换为二进制数。在转换时,将字符串中的每个字符单独转换为一个二进制数,将所有二进制数连接起来进行输出。 案例在实现时,要求使用Math类、String类以及Scanner等常见Java API的常用方法. 2.运行结果 学会分析“十

    2024年02月09日
    浏览(62)
  • LeetCode_字符串_简单_67.二进制求和

    给你两个二进制字符串 a 和 b,以二进制字符串的形式返回它们的和。 示例 1: 输入:a = “11”, b = “1” 输出:“100” 示例 2: 输入:a = “1010”, b = “1011” 输出:“10101” 提示: 1 = a.length, b.length = 10 4 a 和 b 仅由字符 ‘0’ 或 ‘1’ 组成 字符串如果不是 “0” ,就不含前

    2024年02月09日
    浏览(44)
  • 【Golang】IEEE754标准二进制字符串转为浮点类型

      IEEE 754是一种标准,用于表示和执行浮点数运算的方法。在这个标准中,单精度浮点数使用32位二进制表示,分为三个部分:符号位、指数位和尾数位。 符号位(s) 用一个位来表示数的正负,0表示正数,1表示负数。 指数位(e) 用8位表示指数。对于单精度浮点数,指数位是以

    2024年01月21日
    浏览(48)
  • [ERR] [22001] [Microsoft][SQL Server Native Client 10.0][SQL Server]将截断字符串或二进制数据

    使用Navicat导入.csv SQL Server导入.csv文件时报错,但是这个错误不知道具体是哪里的错,然后使用DBeaver导入,提示如下错误 根据报错信息可以看到 Can\\\'t parse numeric value [NULL] using formatter ,不能解析NULL为numeric的值,到.csv文件中查看列值 可以看到列中有NULL值 既然报的是 Can\\\'t pa

    2024年02月12日
    浏览(36)
  • SQL server中:常见问题汇总(如:修改表时不允许修改表结构、将截断字符串或二进制数据等)

    步骤 选择菜单栏中的“工具”-“选项”,在选项对话框左栏中找到“设计器”,在设计器右边取消勾选“阻止保存要求重新创建表的更改”即可。 图例 注意 设计表时,尽量一次性设计成功,避免使用alter修改表,修改起来有各种约束,不容易修改。 解决: 你设置的数据类型

    2024年02月03日
    浏览(41)
  • 2023-06-14 LeetCode每日一题(二进制字符串前缀一致的次数)

    点击跳转到题目位置 给你一个长度为 n 、下标从 1 开始的二进制字符串,所有位最开始都是 0 。我们会按步翻转该二进制字符串的所有位(即,将 0 变为 1)。 给你一个下标从 1 开始的整数数组 flips ,其中 flips[i] 表示对应下标 i 的位将会在第 i 步翻转。 二进制字符串 前缀

    2024年02月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包