一文搞定json解析和封装问题,手把手带你学习CJSON开源代码

CJSON封装,对JSON格式解析及封装源码 阅读详情

努力成为大佬!

JSON简介

JSON 全称 JavaScript Object Notation,即 JS对象简谱,是一种轻量级的数据格式。

它采用完全独立于编程语言的文本格式来存储和表示数据,语法简洁、层次结构清晰,易于人阅读和编写,同时也易于机器解析和生成,有效的提升了网络传输效率。

JSON对象是一个无序的"名称/值"键值对的集合:

  • 以"{“开始,以”}"结束,允许**「嵌套使用」**;
  • 每个**「名称和值成对出现」**,名称和值之间使用":"分隔;
  • 键值对之间用","分隔
  • 在这些字符前后允许存在无意义的空白符;

对于键值,可以有如下值:

  • 一个新的**「json对象」**

  • 「数组」:使用"[“和”]"表示

  • 「数字」:直接表示,可以是整数,也可以是浮点数

  • 「字符串」:使用引号"表示

  • 「字面值」:false、null、true中的一个(必须是小写)

    示例:

  • {
        "students" : [ {
                "name" : "XiaoMing",
                "age" : 10,
                "learning" : true
            }, {
                "name" : "XiaoHong",
                "age" : 11,
                "learning" : false
            } ]
    }
    
    

cJSON介绍

cJSON是一个使用C语言编写的JSON数据解析器,具有超轻便,可移植,单文件的特点,使用MIT开源协议。

cJSON项目托管在Github上,仓库地址如下:

https://github.com/DaveGamble/cJSON

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u0A3wTxg-1630227256609)(C:\Users\11073\AppData\Roaming\Typora\typora-user-images\image-20210829155525088.png)]

可以看到里面的文件比较多,其中cJSON的源码文件只有两个:

  • cJSON.h

  • cJSON.c

    使用的时候,只需要将这两个文件复制到工程目录,然后包含头文件cJSON.h即可,如下:

    #include "cJSON.h"
    

基本使用操作

关键数据结构

/* The cJSON structure: */
typedef struct cJSON
{
    /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
    struct cJSON *next;
    struct cJSON *prev;
    /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
    struct cJSON *child;

    /* The type of the item, as above. */
    int type;

    /* The item's string, if type==cJSON_String  and type == cJSON_Raw */
    char *valuestring;
    /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
    int valueint;
    /* The item's number, if type==cJSON_Number */
    double valuedouble;

    /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
    char *string;
} cJSON;

设计为一个结点结构体,有前后结点和孩子结点,type是该结点存放的数据类型,后面依次为数据存储。

设计思想

**根据上面结构体定义,设计的主要思想就是链表。**通过前后结点遍历,同时使用child*支持嵌套。

首先,它不是将一整段JSON数据抽象出来,而是将其中的一条JSON数据抽象出来,也就是一个键值对,用上面的结构体 strcut cJSON 来表示;
其次,一段完整的JSON数据中由很多键值对组成,并且涉及到键值对的查找、删除、添加,所以使用链表来存储整段JSON数据,如上面的代码所示:

next指针:指向下一个键值对
prev指针:指向上一个键值对

最后,因为JSON数据支持嵌套,所以一个键值对的值会是一个新的JSON数据对象(一条新的链表),也有可能是一个数组,方便起见,在cJSON中,数组也表示为一个数组对象,用链表存储,所以:

在键值对结构体中,当该键值对的值是一个嵌套的JSON数据或者一个数组时,由child指针指向该条新链表。

JSON数据解析

解析JSON数据的过程,其实就是剥离一个一个链表节点(键值对)的过程。

用于**「将字符串解析成json对象」**,若失败则返回NULL。

cJSON *cJSON_Parse(const char *value);

用于**「获取json对象中的某个节点」**,若失败,返回NULL,成功则返回该节点对象。

cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);

用于释放json对象相关内存。

void   cJSON_Delete(cJSON *c);

如果JSON数据的值是数组,可以通过下面接口获取JSON 数组大小和数组里面的JSON 对象

int cJSON_GetArraySize(const cJSON *array);
cJSON * cJSON_GetArrayItem(const cJSON *array, int index);
解析步骤

​ 从网上看到一个比较有趣的王者荣耀的json,下面以它为例:

[{
 "ename": 105,
 "cname": "廉颇",
 "title": "正义爆轰",
 "new_type": 0,
 "hero_type": 3,
 "skin_name": "正义爆轰|地狱岩魂"
}, {
 "ename": 106,
 "cname": "小乔",
 "title": "恋之微风",
 "new_type": 0,
 "hero_type": 2,
 "skin_name": "恋之微风|万圣前夜|天鹅之梦|纯白花嫁|缤纷独角兽"
}]

  1. 通过cJSON接口解析buffer中的字符串
  2. 获取JSON指定字段

解析示例:

#include <stdio.h>
#include "cJSON.h"

char *message =
"[								\
{								\
\"ename\": 105,                 \
\"cname\" : \"廉颇\",			\
\"title\" : \"正义爆轰\",		\
\"new_type\" : 0,				\
\"hero_type\" : 3,				\
\"skin_name\" : \"正义爆轰|地狱岩魂\"	\
},								\
{								\
	\"ename\": 106,					\
	\"cname\" : \"小乔\",			\
	\"title\" : \"恋之微风\",		\
	\"new_type\" : 0,				\
	\"hero_type\" : 2,				\
	\"skin_name\" : \"恋之微风|万圣前夜|天鹅之梦|纯白花嫁|缤纷独角兽\"  \
}									\
]";

int main(void)
{
	cJSON *pJson = NULL;
	cJSON *pVal = NULL;
	cJSON *pTemp = NULL;
	/*创建cJSON对象*/
	pJson = cJSON_Parse(message);
	if (NULL == pJson)
	{
		printf("parse json failed\n");
		return -1;
	}
	/*获取cJSON数组数量*/
	int num = cJSON_GetArraySize(pJson);
	/*遍历每一个cJSON数组元素*/
	for (int index = 0; index<num; index++)
	{
		/*获取cJSON数组中的第index个cJSON对象*/
		pTemp = cJSON_GetArrayItem(pJson, index);

		/*获取cJSON对象中的key值为ename的对象*/
		pVal = cJSON_GetObjectItem(pTemp, "ename");
		printf("ename:%d\n", pVal->valueint);

		pVal = cJSON_GetObjectItem(pTemp, "cname");
		printf("cname:%s\n", pVal->valuestring);

		pVal = cJSON_GetObjectItem(pTemp, "title");
		printf("title:%s\n", pVal->valuestring);

		pVal = cJSON_GetObjectItem(pTemp, "new_type");
		printf("new_type:%d\n", pVal->valueint);

		pVal = cJSON_GetObjectItem(pTemp, "hero_type");
		printf("hero_type:%d\n", pVal->valueint);

		pVal = cJSON_GetObjectItem(pTemp, "skin_name");
		printf("skin_name:%s\n\n", pVal->valuestring);
		printf("====================================\n\n");
	}

	/*释放内存*/
	cJSON_Delete(pJson);
	pJson = NULL;

	return 0;
}

在这里插入图片描述

本示例,演示了解析数组,还有解析单项的操作,其他解析嵌套等操作,大家可以自由探索。

在本示例中,因为我提前知道数据的类型,比如字符型或者浮点型,所以我直接使用指针指向对应的数据域提取,在实际使用时,如果提前不确定数据类型,应该先判断type的值,确定数据类型,再从对应的数据域中提取数据。

json数据封装

封装JSON数据的过程,其实就是**「创建链表」和「向链表中添加节点」**的过程。

首先来讲述一下链表中的一些术语:

  • 「头指针」:指向链表头结点的指针;
  • 「头结点」:不存放有效数据,方便链表操作;
  • 「首节点」:第一个存放有效数据的节点;
  • 「尾节点」:最后一个存放有效数据的节点;
封装步骤

明白了这几个概念之后,我们开始讲述**「创建一段完整的JSON数据」,即如何「创建一条完整的链表」**。

  • ① 「创建头指针」:
 cJSON* cjson_test = NULL;
  • ② 「创建头结点」,并将头指针指向头结点:
cjson_test = cJSON_CreateObject();
  • ③ 尽情的向链表中**「添加节点」**:
/* 添加一个值为 null 的布尔类型的JSON数据(添加一个链表节点) */
cJSON_AddNullToObject(cJSON * const object, const char * const name);
/* 添加一个值为 true 的布尔类型的JSON数据(添加一个链表节点) */
cJSON_AddTrueToObject(cJSON * const object, const char * const name);
/* 添加一个值为 False 的布尔类型的JSON数据(添加一个链表节点) */
cJSON_AddFalseToObject(cJSON * const object, const char * const name);
/* 添加一个值为布尔类型的JSON数据 0:false 非0:true (添加一个链表节点) */
cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);
/* 添加一条数值类型的JSON数据(添加一个链表节点) */
cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);
/* 添加一条字符串类型的JSON数据(添加一个链表节点) */
cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);
/* 添加一行数据(添加一个链表节点) */
cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);
/* 添加一个空对象(添加一个链表节点) */
cJSON_AddObjectToObject(cJSON * const object, const char * const name);
/* 添加一个空数组(添加一个链表节点) */
cJSON_AddArrayToObject(cJSON * const object, const char * const name);
/* 添加一个嵌套的JSON对象/数组(添加一个链表节点) */
cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
cJSON还提供了将JSON对象转换成字符串输出到终端
char *cJSON_Print(const cJSON *item);
封装示例
#include <stdio.h>
#include "cJSON.h"
int main(void)
{
    cJSON* cjson_test = NULL;
    cJSON* cjson_address = NULL;
    cJSON* cjson_skill = NULL;
    char* str = NULL;

    /* 创建一个JSON数据对象(链表头结点) */
    cjson_test = cJSON_CreateObject();

    /* 添加一个值为 null 的布尔类型的JSON数据(添加一个链表节点) */
    cJSON_AddNullToObject(cjson_test, "null_test");

    /* 添加一个值为 true 的布尔类型的JSON数据(添加一个链表节点) */
    cJSON_AddTrueToObject(cjson_test,"true_test");
    /* 添加一个值为 False 的布尔类型的JSON数据(添加一个链表节点) */
    cJSON_AddFalseToObject(cjson_test, "false_test");
    /* 添加一个值为布尔类型的JSON数据 0:false 非0:true (添加一个链表节点) */
    cJSON_AddBoolToObject(cjson_test, "bool_test", 0);

    /* 添加一条整数类型的JSON数据(添加一个链表节点) */
    cJSON_AddNumberToObject(cjson_test, "int_test", 22);

    /* 添加一条浮点类型的JSON数据(添加一个链表节点) */
    cJSON_AddNumberToObject(cjson_test, "double_test", 55.5);

    /* 添加一条字符串类型的JSON数据(添加一个链表节点) */
    cJSON_AddStringToObject(cjson_test, "str_test", "我是字符串");

    /* 添加一行任意数据(添加一个链表节点) */
    cJSON_AddRawToObject(cjson_test, "key", "任意数据");

    /* 添加一个空对象(添加一个链表节点) */
    cJSON_AddObjectToObject(cjson_test, "objet");

    /* 添加一个嵌套的JSON对象(添加一个链表节点) */
    cjson_address = cJSON_CreateObject();
    cJSON_AddStringToObject(cjson_address, "country", "China");
    cJSON_AddNumberToObject(cjson_address, "zip-code", 111111);
    cJSON_AddItemToObject(cjson_test, "address", cjson_address);

    /* 添加一个空数组(添加一个链表节点) */
    cJSON_AddArrayToObject(cjson_test, "Array");

    /* 添加一个数组类型的JSON数据(添加一个链表节点) */
    cjson_skill = cJSON_CreateArray();
    cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "C" ));
    cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "C++" ));
    cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "Python" ));
    cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "Java"));
    cJSON_AddItemToObject(cjson_test, "skill", cjson_skill);

    /* 打印JSON对象(整条链表)的所有数据 */
    str = cJSON_Print(cjson_test);
    printf("%s\n", str);

    return 0;
}

在这里插入图片描述

使用注意事项

内存及时释放

cJSON的所有操作都是基于链表的,所以cJSON在使用过程中大量的使用malloc从堆中分配动态内存的,所以在使用完之后,应当及时调用下面的函数,清空cJSON指针所指向的内存,该函数也可用于删除某一条数据:

(void) cJSON_Delete(cJSON *item);

注意:该函数删除一条JSON数据时,如果有嵌套,会连带删除。

内存钩子

cJSON在支持自定义malloc函数和free函数,方法如下:

① 使用cJSON_Hooks来连接自定义malloc函数和free函数:

typedef struct cJSON_Hooks
{
      /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */
      void *(CJSON_CDECL *malloc_fn)(size_t sz);
      void (CJSON_CDECL *free_fn)(void *ptr);
} cJSON_Hooks;


② 初始化钩子cJSON_Hooks

(void) cJSON_InitHooks(cJSON_Hooks* hooks);

阅读心得

该项目是纯c编写的,运用了大量的指针和动态申请内存,以及一些语言特性static、const的运用,作为C或C++的学习项目还挺有用的。

下面是总结:

比较巧妙的地方

1.链表的使用

2.hooks的使用

typedef struct cJSON_Hooks
{
      /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */
      void *(CJSON_CDECL *malloc_fn)(size_t sz);
      void (CJSON_CDECL *free_fn)(void *ptr);
} cJSON_Hooks;
typedef struct internal_hooks
{
    void *(CJSON_CDECL *allocate)(size_t size);
    void (CJSON_CDECL *deallocate)(void *pointer);
    void *(CJSON_CDECL *reallocate)(void *pointer, size_t size);
} internal_hooks;

json的设计格式

如何用c编写json格式的语言,我找到了作者设计时候的参考图,大家可以简单了解一下:

object是名称/值 的无序集合:

img

数组的设计:

img

键值的设计:

img

string是一个零个或多个Unicode字符的序列,用双引号包装,使用反斜杠转义。字符表示为单个字符串。字符串非常类似于C或Java字符串。

img

数字 非常类似于C或Java数字,只是不使用八进制和十六进制格式。

img

空格可以插入到任意对令牌之间。除了一些编码细节外,这完全描述了语言。

img

可以看到都是用空格做间隔的。

char *message =
"[								\
{								\
\"ename\": 105,                 \
\"cname\" : \"廉颇\",			\
\"title\" : \"正义爆轰\",		\
\"new_type\" : 0,				\
\"hero_type\" : 3,				\
\"skin_name\" : \"正义爆轰|地狱岩魂\"	\
},								\
{								\
	\"ename\": 106,					\
	\"cname\" : \"小乔\",			\
	\"title\" : \"恋之微风\",		\
	\"new_type\" : 0,				\
	\"hero_type\" : 2,				\
	\"skin_name\" : \"恋之微风|万圣前夜|天鹅之梦|纯白花嫁|缤纷独角兽\"  \
}									\
]";

参考资料

一款轻量级的JSON解析库,用cJSON让你看清王者荣耀

cJSON使用详细教程 | 一个轻量级C语言JSON解析器

C语言网络爬虫实战:libcurl解析与免积分下载工具开发 网络爬虫作为自动化获取网页数据的技术,其核心原理在于模拟浏览器行为,通过HTTP协议与服务器进行通信并解析响应内容。在技术实现上,开发者常借助libcurl这类成熟的网络库来处理复杂的HTTP请求、连接管理和会话维持,从而高效稳定地获取目标数据。其技术价值在于能够自动化完成数据采集任务,广泛应用于搜索引擎索引、价格监控、资料归档等场景。本文聚焦于一个具体应用:使用C语言结合libcurl库,构建一个能够从特定文档网站解析页面结构、提取关键信息并实现文件下载的独立可执行工具。该实践不仅涉及网络请求的构建与HT 阅读详情

相关推荐

O4-Mini API:面向边缘设备的轻量级推理协议实战

大模型推理协议是支撑AI落地终端的关键基础设施。传统OpenAI兼容接口虽通用,但在资源受限的嵌入式设备上面临序列化开销大、内存占用高、角色解析歧义等瓶颈。O4-Mini API通过极简请求结构(仅input+config)、无role设计与静态位置偏置等机制,显著降低协议层延迟与模型计算负载,实现低延迟响应和高并发吞吐。其技术价值在于将大模型能力下沉至空调遥控器、工控面板、车载中控等真实边缘场景,支撑语音指令解析、产线报错理解、老人对话交互等任务。本文基于实测数据,详解O4-Mini API在Jetson

chiyingliao3565的博客 395

在android系统下开启App的沉浸模式。(在cocos2d 3.6 中实现游戏全屏/隐藏系统菜单)...

网上大量资料指出在AndroidManifest中进行修改,但是我尝试之后发觉并没有效。 经过实践证明,谷歌在安卓4.4之后提出了一个Immersive Full-Screen Mode的概念(官方文档),我们需要做的是进行和它相关的设置。 你可以在AppActivity中写一个函数 java // This snippet hide...

weixin_34409822的博客 285

GPT-5.5工作流革命:从模型调用到意图编译的操作系统级演进

AI工作流已超越传统大模型能力比拼,进入以任务意图驱动、自动编排工具链、动态上下文管理为核心的新阶段。其底层原理是将自然语言指令实时编译为可执行原子操作序列,依托400K动态知识图谱与原生工具指令集实现跨应用、跨文件、跨API的细粒度自动化。技术价值在于大幅降低工程落地门槛,使开发者无需关注模型部署、API对接或环境配置,专注业务逻辑本身。典型应用场景覆盖科研数据分析、企业合规审计、CI/CD智能补全及多模型协同调度。本文聚焦GPT-5.5驱动的Codex内核重构与Lean可信验证机制,揭示AI如何从‘辅助

weixin_30444105的博客 370

c语言json解包字符串,json解包与json封包

首先,对两个名词进行简单的说明:1.NSData用来存储二进制的数据类型。NSData类提供了一种简单的方式,它用来设置缓冲区、将文件的内容读入缓冲区,或将缓冲区的内容写到一个文件。不变缓冲区(NSData类),也可定义可变的缓冲区(NSMutableData类)。2.json作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式。小结:我们只需要明白NSData类型是用来存储二...

weixin_39859909的博客 573

Unity3D热更新实战:Lua集成架构、性能优化与工程化实践

热更新是现代游戏开发,尤其是移动端项目中的关键技术,它允许开发者在无需重新发布应用商店版本的情况下,动态更新游戏逻辑与内容,从而快速修复线上问题、发布新活动。其核心原理在于将可变的业务逻辑与相对稳定的引擎底层分离,通过脚本语言或代码解释执行机制实现动态加载。在Unity3D生态中,Lua作为一种轻量级、高性能的脚本语言,凭借其易于嵌入和与C#高效交互的特性,成为实现热更新的主流技术方案之一,广泛应用于手游等需要频繁迭代的业务场景。本文聚焦于**xLua**与**ToLua#** 两大主流桥接方案的深度解析,

weixin_34290096的博客 531

DeepSeek V4生产级落地三步法:推理底座+业务切口+系统集成

大语言模型工程化核心在于将强大推理能力转化为稳定、可控、可运维的业务服务。本文聚焦LLM落地中最普遍的断层——模型能力与真实系统之间的集成鸿沟,围绕DeepSeek V4这一典型高性能开源模型,系统阐述‘稳推理底座、准业务切口、无缝系统集成’三层技术路径。通过GGUF量化适配非A100硬件、Prompt+RAG+缓存替代微调、Nginx+Lua协议桥接等实操方案,解决显存碎片、中文BOM乱码、向量分词不一致、gRPC连接耗尽等23类高频生产问题。适用于金融风控、智能客服、运维诊断等需高准确率、低延迟、强SL

weixin_34348174的博客 449

来自C++ 标准库封装 Json结构极易扩展

包含 Json::Value Json::Array,支持Json::Object初始化列表,支持常用类型转换

Funning的博客 580

VC6.0 环境集成 libCurl 实现 HTTP 请求的完整实践指南

在工业设备、自动化产线等长期维护的旧系统中,联网能力常成为新需求。HTTP 请求作为最通用的数据传输方式,在 C 语言工程中通常借助 libcurl 这个轻量级网络库实现。libcurl 以纯 C 接口和跨平台特性著称,支持 HTTP、HTTPS、FTP 等协议,尤其适合嵌入 VC6.0 这类老旧编译器环境。然而老旧编译环境与新版库源码之间存在天然隔阂,版本选择、依赖链控制、运行库匹配往往成为集成过程中的主要障碍。本文从工程实践出发,介绍如何在 VC6.0 中配置 libcurl 静态库、快速实现 GET

weixin_34038293的博客 361

C、C++中对json格式数据的解析和封装

【代码】C语言中对json格式数据的解析和封装。

浮若于心 8613

好用的cJSON库,测试通过-64位

该cJSON库,通过VS2019编译而成,属于64位静态库

BMS短路测试避坑指南:从炸管到稳定,我是如何搞定MOS管和TVS的

本文详细记录了BMS短路测试中MOS管和TVS的优化过程,从驱动电阻调整、PCB寄生参数控制到TVS选配策略,提供了一套实用的调试方法论。通过实战案例解析,帮助工程师避免常见陷阱,实现稳定可靠的短路测试性能。

weixin_30652897的博客 140

开源代码学习:json11源码阅读

本篇是《开源代码学习》的第二篇,上一篇为:《一文搞定json解析和封装问题,手把手带你学习CJSON开源代码》 本文阅读一下json11的代码,json11是使用C++11编写的json库,对json11代码或者使用感兴趣的小伙伴可以阅读一下此文。 json11 ...

CodeBowl的博客 926

生成式引擎优化(GEO)标准化操作流程:构建高效AI生成系统的全链路指南

GEO是针对生成式AI的内容优化策略,通过提升内容在AI生成答案中的引用优先级实现品牌传播。相比传统SEO,GEO使内容直接嵌入AI答案,无需用户点击链接。核心流程包括:1)逆向拆解AI问答场景,结构化知识资产;2)生产权威内容(白皮书、专利数据)和算法适配内容(PCOE模板);3)技术实现(数据投喂、模型微调);4)331渠道分发策略;5)效果监控与动态防御。需注意采用结构化数据标记、主动提交训练数据,并避免简单复制SEO策略。2025版强调内容权威性和语义优化,通过AI原生内容工程实现高效曝光。

解锁AI流量新红利!🚀 GEO优化(生成引擎优化)助您掌控AI搜索,让AI成为您的品牌最佳代言人! 1164

STM32大棚远程灌溉系统:从传感器到云平台的全链路实现

物联网技术的成熟让智慧农业从概念走向田间地头,远程灌溉作为典型应用,正成为嵌入式开发者热衷的实践方向。一套完整的远程灌溉系统本质上包含感知、传输、控制、展示四个层次,其中STM32作为主控核心,负责传感器数据采集与执行逻辑,ESP8266则承担无线联网与云端通信的桥梁作用。通过ADC模拟量采集、单总线协议驱动、MQTT协议对接云平台等嵌入式关键技术,开发者能够构建从土壤湿度监测到水泵远程/自动控制的闭环系统。这类方案不仅适用于毕业设计,也是快速搭建可演示智慧农业原型的有效路径。本文以西瓜大棚场景为例,系统拆

weixin_28685287的博客 310

HDMI2.1/eDP TX接口设计:

HDMI2.1向下兼容,HDMI2.1工作在FRL模式,HDMI2.0工作在TMDS模式。因此采用AC耦合电压模式驱动器。一般采用220nF,封装建议0201。,但是协议要求,往 CEC 管脚通过 27K 电阻加 3.3V 电压,漏电不允许超过。NOTE:如果只需要支持 HDMI2.0 及以下模式时, MOS管也不能省掉。DDC_SCL/DDC_SDA 协议规定是。HDMI2.0模式:配置为高,MOS导通。HDMI2.1模式:配置为低,MOS不导通。,必须增加电平转换电路。形成直流偏置,大约3V。

qq_40010777的博客 7866

[代码开源]基于DistFlow的IEEE33和IEEE69节点最优潮流模型(OPF)实现与性能分析

本文详细介绍了基于DistFlow的IEEE33和IEEE69节点最优潮流模型(OPF)的实现与性能分析。通过代码开源,展示了如何从零搭建电力系统优化模型,解决配电网中的发电成本最小化问题。文章涵盖数据准备、模型实现细节、性能优化建议及常见问题解答,为电力系统研究者提供实用参考。

weixin_29103191的博客 709

Linux命令行电子词典开发:从离线词库解析到SQLite缓存实战

在Linux环境下,命令行工具与本地应用开发是系统编程与自动化运维的核心技能。其原理在于通过组合系统调用、进程管理、文件IO与网络通信等底层机制,构建高效、可定制的实用程序。这类技术的价值在于能深度契合开发者的工作流,提升效率,并强化对系统本身的理解。典型的应用场景包括服务器管理、嵌入式开发以及日常自动化任务。本文聚焦于一个具体实践:开发一个功能完整的命令行电子词典。该项目综合运用了离线词库解析(如StarDict格式)、SQLite本地缓存、网络API集成以及ncurses终端界面开发,展示了如何将分散的

virusswb的专栏 400

iTunes登录协议全解析:从抓包到签名验证(含HTTPDebugger避坑指南)

本文深入解析了iTunes登录协议的核心流程,包括sign-sap-setup-cert和sign-sap-setup-buffer等关键请求,并提供了使用HTTPDebugger等工具进行抓包分析时绕过反调试检测的实战技巧与避坑指南。文章详细拆解了PLIST编解码、请求签名验证机制及密码加密逻辑,为网络安全研究和协议逆向提供了完整的技术路径。

weixin_29224309的博客 331

嵌入式AI工作台:本地化API调试与硬件协同分析

嵌入式API调试是连接软件逻辑与硬件行为的关键环节,其本质是通过标准化协议(如HTTP/JSON)实现开发主机与MCU的双向语义交互。传统工具如curl或Postman缺乏对HAL库、寄存器上下文和实时内存的感知能力,而云端AI助手又面临数据合规、网络延迟与领域语境错位三大瓶颈。基于本地大模型(如Qwen2-7B)与轻量桥接层(STM32+FreeRTOS+LwIP)构建的离线工作台,将代码分析、寄存器读写、I2C/SPI指令透传等能力封装为可审计、可复现、零外链的API服务,显著提升Modbus、CAN、

weixin_33796205的博客 430

【4. BSP开发指南 - [4.6. 安全启动使用说明]】

【4. BSP开发指南 - [4.6. 安全启动使用说明]】

Sugar_wolf的博客 276

JeecgBoot passwordChange 任意用户密码重置漏洞复现

​JeecgBoot 框架passwordChange接口存在任意用户密码重置漏洞,未经身份验证的远程攻击者可以利用此漏洞重置管理员账户密码,从而接管系统后台,造成信息泄露,导致系统处于极不安全的状态。

0xSec 2643

基于STM32的物联网智能家居项目实战:从点灯到云端控制

在嵌入式开发中,STM32作为经典的ARM微控制器,常被用于构建智能家居等物联网系统。其核心原理是通过GPIO、定时器、串口、I2C、PWM等外设实现数据采集与设备控制,再借助ESP8266等通信模块将数据通过MQTT协议传输至云端平台,完成设备与应用的实时交互。这种“主控+通信模组”的分层架构,既降低了单项技术的入门门槛,又完整覆盖了物联网项目的链路设计。无论是环境监测、远程开关还是场景联动,该方案均可灵活适配,是理解嵌入式与物联网协同工作的典型实践。本文基于STM32F103C8T6与ESP8266,详

weixin_34414196的博客 386

SAP S/4HANA Public Cloud 配置全景实践

本文提供SAP S/4HANA Public Cloud配置的实用指南,重点介绍三大核心工具:CBC(范围界定与配置)、SAP Activate(方法论与路线图)和Cloud ALM(项目执行与运维)。文章详解了不同系统架构(2SL/3SL)的配置路径,并以制造企业案例说明端到端实施流程。同时提供了工具协同操作方法、初始访问安全建议和常见问题的专家意见,帮助项目团队高效完成实施工作。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 562

如何用GoldHEN Cheats Manager轻松管理PS4游戏作弊码

想要在PlayStation 4上享受更自由的游戏体验吗?GoldHEN Cheats Manager是你不可或缺的终极PS4游戏修改神器!这款开源的金手指管理器让普通玩家也能轻松管理超过1490款游戏的作弊代码,无需复杂操作,一键即可解锁无限可能。无论你是想降低游戏难度、解锁隐藏内容,还是单纯想探索游戏的另一种玩法,这款工具都能满足你的需求。 ## 🎮 为什么选择GoldHEN金手指管理器?

gitblog_00032的博客 126

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

嵌入式工程师有前途吗?十年大厂经验详解前景、学习路线与面试

在万物互联与智能设备普及的背景下,嵌入式系统作为硬件与软件融合的关键技术,已成为支撑汽车电子、工业控制、物联网等领域的底层基石。从单片机裸机开发到RTOS实时操作系统,再到嵌入式Linux驱动与内核优化,嵌入式工程师需要构建从寄存器级操作到系统级架构的完整知识体系。随着智能汽车、储能、智能家居等场景持续爆发,具备深度系统能力的人才需求旺盛,薪资与职业空间的分化也日趋明显。C语言功底、RTOS原理、Linux应用与驱动开发、工具链与开源生态的掌握,是走向高阶岗位的核心路径。结合大厂十余年实践经验,系统剖析行业

weixin_29176179的博客 243

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

fmt库:C++零开销字符串格式化的编译期实践

字符串格式化是C++基础IO操作的核心环节,涉及类型安全、内存分配与运行时开销等关键问题。传统方案如printf缺乏编译期类型检查,iostream依赖虚函数调用和动态内存分配,导致性能不可控、调试困难。fmt库以C++11/17模板元编程为基础,通过constexpr解析、变参模板特化与零成本抽象,实现格式串与参数类型的编译期校验,消除运行时不确定性。其技术价值在于将格式化从‘黑盒调用’转变为‘确定性计算’,显著提升日志、序列化、HUD渲染等高频场景的吞吐量与实时性。本文聚焦fmt在生产环境中的落地逻辑与

weixin_34262482的博客 394

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: c++11新特性:变长参数模板详解
下一篇: 委托构造函数详解,小白也可以看懂
CodeBowl
博客等级 码龄5年 7664粉丝 67原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值