c语言简单json库
文章目录
- 写在前面
- 头文件
- 源代码
- 使用示例
写在前面
用c语言实现的一个简单json库,极其轻量
仅1个四百多行源码的源文件,和1个头文件
支持对象、数组、数值、字符串类型
github仓库
头文件
对主要的json API的声明
#ifndef ARCOJSON_ARCOJSON_H
#define ARCOJSON_ARCOJSON_H#define VERSION v0.1
enum json_type{json_type_empty,json_type_object,json_type_array,json_type_string,json_type_long
};typedef struct arco_json{enum json_type type;int child_num;int seq;char* key;void* value;struct arco_json* parent;struct arco_json* next;
}arco_json;/*** function: new_json_object* 功能:创建一个json对象*/
arco_json* new_json_object();/*** function: new_json_array* 功能:创建一个json数组*/
arco_json* new_json_array();/*** function:* 功能:创建一个json, value是字符串*/
arco_json* new_json_string(char* value);/*** function: new_json_long* 功能:创建一个json, value是long类型的字符串* 说明:为了代码简洁, 仅使用long来表示数值*/
arco_json* new_json_long(long value);/*** function: get_json_type* 功能:返回json的类型*/
int get_json_type(arco_json* json);/*** function: json_object_add* 功能:给json对象添加键值对*/
int json_object_add(arco_json* json, char* key, arco_json* j_add);/*** function: json_array_add* 功能:给json数组添加对象*/
int json_array_add(arco_json* json, arco_json* j_add);/*** function: json_to_string* 功能:json对象转json格式字符串*/
char* json_to_string(arco_json* json);/*** function: string_to_json* 功能:json格式字符串转json对象*/
arco_json* string_to_json(char* str);/*** function: get_string_from_object* 功能:通过key获取字符串类型的value*/
char* get_string_from_object(arco_json* json, char* key);/*** function: get_long_from_object* 功能:通过key获取数值类型的value*/
long get_long_from_object(arco_json* json, char* key);/*** function: get_object_from_object* 功能:通过key获取object类型的value*/
arco_json* get_object_from_object(arco_json* json, char* key);/*** function: get_object_from_array* 功能:获取json array的第idx个对象(从0开始*/
arco_json* get_object_from_array(arco_json* json, int idx);#endif //ARCOJSON_ARCOJSON_H
源代码
//
// Created by arco on 2023/8/19.
//
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "arcojson.h"int g_json_char_num = 0;
char* g_json_str = NULL;int init_new_json(arco_json* json, int json_type)
{json->type = json_type;json->child_num = 0;json->seq = 0;json->key = NULL;json->value = NULL;json->next = NULL;
}arco_json* new_json_object()
{arco_json* json = malloc(sizeof(arco_json));init_new_json(json, json_type_object);return json;
}arco_json* new_json_array()
{arco_json* json = malloc(sizeof(arco_json));init_new_json(json, json_type_array);return json;
}arco_json* new_json_string(char* value)
{// 分配内存arco_json* json = malloc(sizeof(arco_json));init_new_json(json, json_type_string);json->value = (char*) malloc(strlen(value) + 1);memcpy(json->value, value, strlen(value) + 1);return json;
}arco_json* new_json_long(long value)
{// 分配内存arco_json* json = malloc(sizeof(arco_json));init_new_json(json, json_type_long);json->value = (long*) malloc(sizeof(long));*(long*) json->value = value;return json;
}arco_json* new_json_empty()
{// 分配内存arco_json* json = malloc(sizeof(arco_json));init_new_json(json, json_type_empty);return json;
}int get_json_type(arco_json* json)
{if (json != NULL) return json->type;else return -1;
}int json_object_add(arco_json* json, char* key, arco_json* j_add)
{if (json->type != json_type_object) {printf("json type isn't object, can't add kv\n");return -1;}int i;// if cur json has none valueif (json->value == NULL) {json->value = j_add;j_add->parent = json;j_add->key = malloc(strlen(key) + 1);memcpy(j_add->key, key, strlen(key) + 1);json->child_num++;}else {arco_json* arco = json->value;for (i = 0; i < json->child_num - 1; i++) {arco = arco->next;}j_add->key = malloc(strlen(key) + 1);memcpy(j_add->key, key, strlen(key) + 1);arco->next = j_add;j_add->parent = arco->parent;json->child_num++;}return 0;
}int json_array_add(arco_json* json, arco_json* j_add)
{if (json->type != json_type_array) {printf("json type isn't array, can't add object\n");return -1;}int i;// if cur json has none valueif (json->value == NULL) {json->value = j_add;json->child_num++;}else {arco_json* arco = json->value;for (i = 0; i < json->child_num - 1; i++) {arco = arco->next;}arco->next = j_add;j_add->parent = arco->parent;json->child_num++;}return 0;
}typedef void (*deal_callback) (char*, ...);void json_depth_expand(arco_json* json, int depth, deal_callback callback)
{if (get_json_type(json) == json_type_array) {if (json->key != NULL && depth > 0)callback("\"%s\":", json->key);callback("[");if (json->value != NULL)json_depth_expand(json->value, depth + 1, callback);}if (get_json_type(json) == json_type_object) {if (json->key != NULL && depth > 0)callback("\"%s\":", json->key);callback("{");if (json->value != NULL)json_depth_expand(json->value, depth + 1, callback);}if (json->type == json_type_string) {callback("\"%s\":", json->key);callback("\"%s\"", (char*) json->value);if (json->next != NULL) callback(",");}if (json->type == json_type_long) {callback("\"%s\":", json->key);callback("%d", *(long*) json->value);if (json->next != NULL) callback(",");}if (get_json_type(json) == json_type_array) {callback("]");if (json->next != NULL && depth > 0) callback(",");}if (get_json_type(json) == json_type_object) {callback("}");if (json->next != NULL && depth > 0) callback(",");}// 横向搜索if (json->next != NULL && depth > 0) {json_depth_expand(json->next, depth, callback);}
}void calculate_callback(char* fmt, ...)
{va_list args;va_start(args, fmt);char str[64];vsprintf(str, fmt, args);g_json_char_num += (int) strlen(str);va_end(args);
}void tostring_callback(char* fmt, ...)
{va_list args;va_start(args, fmt);char str[64];vsprintf(str, fmt, args);strcat(g_json_str, str);va_end(args);
}int calculate_json_str_length(arco_json* json)
{g_json_char_num = 0;json_depth_expand(json, 0, calculate_callback);return g_json_char_num;
}char* json_to_string(arco_json* json)
{int size = calculate_json_str_length(json);g_json_str = malloc(size + 1);memset(g_json_str, '\0', size + 1);json_depth_expand(json, 0, tostring_callback);char* json_str = malloc(strlen(g_json_str) + 1);memcpy(json_str, g_json_str, strlen(g_json_str) + 1);free(g_json_str);g_json_str = NULL;return json_str;
}char* str_get_here_to_there(char* str, int position, char c)
{int i, size = 1;char* dst = NULL;for (i = position; i < strlen(str); i++) {if (str[i] != c) size++;else break;}dst = malloc(sizeof(char) * size);for (i = position; i < strlen(str); i++) {if (str[i] != c) dst[i - position] = str[i];else {dst[i - position] = '\0';return dst;}}return NULL;
}// 返回值是解析的数值的字符串长度(需要跳过的长度
int parse_num_value(char* str, void* value)
{int i, start = 0, val_len = 0;long rate = 1;long* num_val = malloc(sizeof(long));char arr[16];memset(arr, '\0', sizeof(arr));if (str[0] == '-') start = 1;val_len += start;for (i = start; i < strlen(str) && i < sizeof(arr) - 1; i++) {if (str[i] < '0' || str[i] > '9') break;arr[i - start] = str[i];val_len++;}for (i = strlen(arr) - 1; i >= 0; i--) {*num_val += (arr[i] - '0') * rate;rate *= 10;}if (start) *num_val *= -1;*(long*) value = *num_val;return val_len;
}arco_json* string_to_json(char* str)
{int i, str_len = (int) strlen(str), need_new = 0;int yh_flag = 0, value_flag = 0;arco_json* json = new_json_empty();arco_json* p_json = json;for (i = 0; i < str_len; i++) {/*** 紧随{或[后的第一个json还没有new出来*/if (need_new) {arco_json* j_tmp = new_json_empty();p_json->value = j_tmp;j_tmp->parent = p_json;p_json = p_json->value;need_new = 0;}/*** 截取第1-2个引号之间的值作为key, 如果有第3-4个引号那就作为value*/if (str[i] == '"') {yh_flag++;if (yh_flag == 1) {p_json->key = str_get_here_to_there(str, i + 1, '"');}else if (yh_flag == 2) {}else if (yh_flag == 3) {p_json->value = str_get_here_to_there(str, i + 1, '"');p_json->type = json_type_string;}else if (yh_flag == 4) {yh_flag = 0;}}/*** 处理冒号后紧随的第一个*/if (value_flag) {if ((str[i] >= '0' && str[i] <= '9') || str[i] == '-') {p_json->type = json_type_long;p_json->value = (long*)malloc(sizeof(long));i += parse_num_value(&str[i], p_json->value);yh_flag = 0;}value_flag = 0;}if (str[i] == ':') {value_flag = 1;}if (str[i] == '{') {yh_flag = 0;need_new = 1;p_json->type = json_type_object;}if (str[i] == '[') {yh_flag = 0;need_new = 1;p_json->type = json_type_array;}if (str[i] == ',') {// 创建一个空json, 挂到当前json的nextarco_json* j_tmp = new_json_empty();j_tmp->seq = p_json->seq + 1;p_json->next = j_tmp;// 拷贝上级jsonj_tmp->parent = p_json->parent;// 如果是第1个确保当前json的上级的value指向正确if (p_json->seq == 0) {arco_json* q_json = p_json->parent;q_json->value = p_json;}// 移动当前jsonp_json = p_json->next;}if (str[i] == '}' || str[i] == ']') {arco_json* j_tmp = p_json->parent;p_json = j_tmp;}}return json;
}char* get_string_from_object(arco_json* json, char* key)
{if (json == NULL) return NULL;if (json->type != json_type_object) return NULL;if (json->value == NULL) return NULL;arco_json* p_json = json->value;while (p_json != NULL) {if (p_json->type == json_type_string) {if (strcmp((char*) p_json->key, key) == 0) {size_t length = strlen((char*) p_json->value);char* res = malloc(sizeof(length + 1));memcpy(res, p_json->value, length + 1);return res;}}p_json = p_json->next;}return NULL;
}long get_long_from_object(arco_json* json, char* key)
{if (json == NULL) return -1;if (json->type != json_type_object) return -1;if (json->value == NULL) return -1;arco_json* p_json = json->value;while (p_json != NULL) {if (p_json->type == json_type_long) {if (strcmp((char*) p_json->key, key) == 0) {long res = *(long*) p_json->value;return res;}}p_json = p_json->next;}return -1;
}arco_json* get_object_from_object(arco_json* json, char* key)
{if (json == NULL) return NULL;if (json->type != json_type_object) return NULL;if (json->value == NULL) return NULL;arco_json* p_json = json->value;while (p_json != NULL) {if (p_json->type == json_type_object) {if (strcmp((char*) p_json->key, key) == 0) {arco_json* res = malloc(sizeof(arco_json));memcpy(res, p_json, sizeof(arco_json));return res;}}p_json = p_json->next;}return NULL;
}arco_json* get_object_from_array(arco_json* json, int idx)
{if (json == NULL) return NULL;if (json->type != json_type_array) return NULL;if (json->value == NULL) return NULL;int i = 0;arco_json* p_json = json->value;while (p_json != NULL) {if (p_json->type == json_type_object) {if (i == idx) {arco_json* res = malloc(sizeof(arco_json));memcpy(res, p_json, sizeof(arco_json));return res;}}p_json = p_json->next;i++;}return NULL;
}
使用示例
请直接看最下面的main函数
//
// Created by arco on 2023/9/3.
//
#include <string.h>
#include <stdio.h>
#include "arcojson.h"/*** test arco json usage*/
void create_json_object_test()
{arco_json* json = new_json_object();json_object_add(json, "key0", new_json_string("value0"));arco_json* json1 = new_json_object();json_object_add(json1, "key1.0", new_json_string("value1.0"));json_object_add(json, "key1", json1);arco_json* json2 = new_json_object();arco_json* json20 = new_json_object();json_object_add(json20, "key2.0.1", new_json_string("value2.0.1"));json_object_add(json2, "key2.0", json20);json_object_add(json, "key2", json2);printf("create_json_obj:%s\n", json_to_string(json));
}void create_json_object_test_long()
{arco_json* json = new_json_object();json_object_add(json, "key0", new_json_long(100));arco_json* json1 = new_json_object();json_object_add(json1, "key1.0", new_json_long(-1));json_object_add(json, "key1", json1);arco_json* json2 = new_json_object();arco_json* json20 = new_json_object();json_object_add(json20, "key2.0.1", new_json_long(-1234567));json_object_add(json20, "key2.0.2", new_json_string("value2.0.2"));json_object_add(json2, "key2.0", json20);json_object_add(json, "key2", json2);printf("create_json_obj_num:%s\n", json_to_string(json));
}void create_json_array_test()
{arco_json* json = new_json_array();arco_json* json0 = new_json_object();json_object_add(json0, "key0", new_json_string("value0"));arco_json* json1 = new_json_object();json_object_add(json1, "key1", new_json_string("value1"));arco_json* json2 = new_json_object();arco_json* json20 = new_json_object();json_object_add(json20, "key2.0", new_json_string("value2.0"));json_object_add(json2, "key2", json20);json_array_add(json, json0);json_array_add(json, json1);json_array_add(json, json2);printf("create_json_arr:%s\n", json_to_string(json));
}void create_json_mixed_test()
{arco_json* json = new_json_object();arco_json* j_o0 = new_json_object();json_object_add(j_o0, "ok0", new_json_string("oval0"));arco_json* j_a1 = new_json_array();arco_json* j_o10 = new_json_object();json_object_add(j_o10, "ok10", new_json_string("oval10"));arco_json* j_o11 = new_json_object();json_object_add(j_o11, "ok11", new_json_string("oval11"));json_object_add(j_o11, "ok12", new_json_string("oval12"));json_array_add(j_a1, j_o10);json_array_add(j_a1, j_o11);arco_json* j_o2 = new_json_object();arco_json* j_o20 = new_json_object();json_object_add(j_o20, "ok20", new_json_string("oval20"));json_object_add(j_o20, "ok21", new_json_string("oval21"));json_object_add(j_o20, "ok22", new_json_string("oval22"));json_object_add(j_o2, "ok2", j_o20);json_object_add(json, "obj_1", j_o0);json_object_add(json, "arr_1", j_a1);json_object_add(json, "obj_2", j_o2);printf("create_json_mix:%s\n", json_to_string(json));
}void create_json_null_test()
{arco_json* json_o = new_json_object();arco_json* json_a = new_json_array();printf("create_json_nul:%s %s\n", json_to_string(json_o), json_to_string(json_a));
}void str_to_json_object_test()
{char str[] = "{\"key0\":\"value0\",\"key1\":{\"key1.0\":\"value1.0\"},\"key2\":{\"key2.0\":{\"key2.0.1\":\"value2.0.1\"}}}";arco_json* json = string_to_json(str);printf("str_to_json_obj:%s\n", json_to_string(json));
}void str_to_json_object_test_long()
{char str[] = "{\"key0\":100,\"key1\":{\"key1.0\":-1},\"key2\":{\"key2.0\":{\"key2.0.1\":-1234567,\"key2.0.2\":\"value2.0.2\"}}}";arco_json* json = string_to_json(str);printf("str_to_json_obj_num:%s\n", json_to_string(json));
}void str_to_json_array_test()
{char str[] = "[{\"key0\":\"value0\"},{\"key1\":\"value1\"},{\"key2\":{\"key2.0\":\"value2.0\"}}]";arco_json* json = string_to_json(str);printf("str_to_json_arr:%s\n", json_to_string(json));
}void str_to_json_mixed_test()
{char str[] = "{\"obj_1\":{\"ok0\":\"oval0\"},\"arr_1\":[{\"ok10\":\"oval10\"},{\"ok11\":\"oval11\",\"ok12\":\"oval12\"}],\"obj_2\":{\"ok2\":{\"ok20\":\"oval20\",\"ok21\":\"oval21\",\"ok22\":\"oval22\"}}}";arco_json* json = string_to_json(str);printf("str_to_json_mix:%s\n", json_to_string(json));
}void str_to_json_null_test()
{char str[] = "{}";arco_json* json = string_to_json(str);char str2[] = "[]";arco_json* json2 = string_to_json(str2);printf("str_to_json_null:%s %s\n", json_to_string(json), json_to_string(json2));
}void json_depth_expand_print(arco_json* json, int depth)
{
// printf("depth=%d\n", depth);if (get_json_type(json) == json_type_array) {if (json->key != NULL && depth > 0) printf("\"%s\":", json->key);printf("[");json_depth_expand_print(json->value, depth + 1);}if (get_json_type(json) == json_type_object) {if (json->key != NULL && depth > 0) printf("\"%s\":", json->key);printf("{");json_depth_expand_print(json->value, depth + 1);}if (json->type == json_type_string) {printf("\"%s\":", json->key);printf("\"%s\"", (char*) json->value);if (json->next != NULL) printf(",");}if (json->type == json_type_long) {printf("\"%s\":", json->key);printf("%d", *(int*) json->value);if (json->next != NULL) printf(",");}if (json->type == json_type_empty) {printf("tmd empty\n");}if (get_json_type(json) == json_type_array) {printf("]");if (json->next != NULL && depth > 0) printf(",");}if (get_json_type(json) == json_type_object) {printf("}");if (json->next != NULL && depth > 0) printf(",");}// 横向搜索if (json->next != NULL && depth > 0) {json_depth_expand_print(json->next, depth);}
}void get_json_value_test()
{arco_json* json = new_json_array();arco_json* json0 = new_json_object();json_object_add(json0, "key00", new_json_long(123));json_object_add(json0, "key01", new_json_string("value01"));json_object_add(json0, "key02", new_json_string("value02"));arco_json* json1 = new_json_object();arco_json* json10 = new_json_object();json_object_add(json10, "key10", new_json_string("value10"));json_object_add(json10, "key11", new_json_long(1234567));json_object_add(json1, "key1", json10);json_array_add(json, json0);json_array_add(json, json1);printf("get_json_value_test:%s\n", json_to_string(json));arco_json* get_obj_by_idx = get_object_from_array(json, 1);printf("get_obj_by_idx:%s\n", json_to_string(get_obj_by_idx));arco_json* get_obj_by_key = get_object_from_object(get_obj_by_idx, "key1");printf("get_obj_by_key:%s\n", json_to_string(get_obj_by_key));char* get_str = get_string_from_object(get_obj_by_key, "key10");printf("get_str_value:%s\n", get_str);long get_long = get_long_from_object(get_obj_by_key, "key11");printf("get_str_value:%ld\n", get_long);}int main()
{// 创建json对象示例create_json_object_test();str_to_json_object_test();printf("\n");// 创建带数值的json对象示例create_json_object_test_long();str_to_json_object_test_long();printf("\n");// 创建json数组示例create_json_array_test();str_to_json_array_test();printf("\n");// 对象和数组混合示例create_json_mixed_test();str_to_json_mixed_test();printf("\n");// null情况示例create_json_null_test();str_to_json_null_test();printf("\n");// json对象获取值示例(数组 对象 字符串 数值get_json_value_test();return 0;
}
编译:arcojson.c arcojson.h example.c三个文件放在同一目录下,然后 gcc arcojson.c example.c -o test
运行: ./test
相关文章:
c语言简单json库
文章目录 写在前面头文件源代码使用示例 写在前面 用c语言实现的一个简单json库,极其轻量 仅1个四百多行源码的源文件,和1个头文件 支持对象、数组、数值、字符串类型 github仓库 头文件 对主要的json API的声明 #ifndef ARCOJSON_ARCOJSON_H #defin…...

Linux操作系统基础(七):Linux常见命令(二)
文章目录 Linux常见命令(二) 一、kill命令 二、ifconfig命令 三、clear命令 四、重启与关机命令 五、which命令 六、hostname命令 七、grep命令 八、|管道 九、useradd命令 十、userdel命令 十一、tar命令 十二、su命令 十三、ps命令 Linu…...

进程状态
广义概念: 从广义上来讲,进程分为新建、运行、阻塞、挂起、退出五个状态,其中新建和退出两个状态可以直接理解字面意思。 运行状态: 这里涉及到运行队列的概念,CPU在读取数据的时候,需要把内存中的进程放入…...

STM32固件库简介与使用指南
1. STM32官方标准固件库简介 STM32官方标准固件库是由STMicroelectronics(ST)提供的一套软件开发工具,旨在简化STM32微控制器的软件开发过程。该固件库提供了丰富的功能和模块,涵盖了STM32微控制器的各种外设,包括但不…...

【开源】SpringBoot框架开发智能教学资源库系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程档案表3.2.2 课程资源表3.2.3 课程作业表3.2.4 课程评价表 四、系统展示五、核心代…...

融资项目——获取树形结构的数据
如下图所示,下列数据是一个树形结构数据,行业中包含若干子节点。表的设计如下图,设置了一个id为1的虚拟根节点。(本树形结构带虚拟根节点共三层) 实现逻辑: 延时展示方法,先展现第二层的信息&a…...

Crypto-RSA2
题目:(BUUCTF在线评测 (buuoj.cn)) 已知e,n,dp/(dq),c求明文: 首先有如下公式: dp ≡ d mod (p-1) ,ed ≡ 1 mod φ(n) ,npq ,φ(n)(p-1)(q-1) python代码实现如下: import libnu…...

IEEE Internet of Things Journal投稿经验
期刊名:IEEE Internet of Things Journal 期刊分区:中科院一区 Top 影响因子:10.6 投稿状态 (1)2023.11.3,投稿成功,状态为:under review(大u大r)࿱…...

实例分割论文阅读之:FCN:《Fully Convolutional Networks for Semantica Segmentation》
论文地址:https://openaccess.thecvf.com/content_cvpr_2015/papers/Long_Fully_Convolutional_Networks_2015_CVPR_paper.pdf 代码链接:https://github.com/pytorch/vision 摘要 卷积网络是强大的视觉模型,可以产生特征层次结构。我们证明,…...

apk反编译修改教程系列---简单去除apk登陆 修改vip与一些反编译基础常识【十二】
往期教程: 安卓玩机-----反编译apk 修改apk 去广告 去弹窗等操作中的一些常识apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中…...
网络安全习题集
第一章 绪论 4 ISO / OSI 安全体系结构中的对象认证安全服务使用( C ) 机制来完成。 A .访问控制 B .加密 C .数字签名 D .数据完整性 5 身份鉴别是安全服务中的重要一环,以下关于身份鉴别的叙述不正确的是…...

C++中的volatile:穿越编译器的屏障
C中的volatile:穿越编译器的屏障 在C编程中,我们经常会遇到需要与硬件交互或多线程环境下访问共享数据的情况。为了确保程序的正确性和可预测性,C提供了关键字volatile来修饰变量。本文将深入解析C中的volatile关键字,介绍其作用、…...
(07)Hive——窗口函数详解
一、 窗口函数知识点 1.1 窗户函数的定义 窗口函数可以拆分为【窗口函数】。窗口函数官网指路: LanguageManual WindowingAndAnalytics - Apache Hive - Apache Software Foundationhttps://cwiki.apache.org/confluence/display/Hive/LanguageManual%20Windowing…...

【开源图床】使用Typora+PicGo+Github+CDN搭建个人博客图床
准备工作: 首先电脑得提前完成安装如下: 1. nodejs环境(node ,npm):【安装指南】nodejs下载、安装与配置详细教程 2. Picgo:【安装指南】图床神器之Picgo下载、安装与配置详细教程 3. Typora:【安装指南】markdown神器之Typora下载、安装与无限使用详细教…...
阅读笔记(SOFT COMPUTING 2018)Seam elimination based on Curvelet for image stitching
参考文献: Wang Z, Yang Z. Seam elimination based on Curvelet for image stitching[J]. Soft Computing, 2018: 1-16. 注:SOFT COMPUTING 大类学科小类学科Top期刊综述期刊工程技术 3区 COMPUTER SCIENCE, ARTIFICIAL INTELLIGENCE 计算机…...
LinkedList数据结构链表
LinkedList在Java中是一个实现了List和Deque接口的双向链表。它允许我们在列表的两端添加或删除元素,同时也支持在列表中间插入或移除元素。在分析LinkedList之前,需要理解链表这种数据结构: 链表:链表是一种动态数据结构&#x…...

[计算机网络]---序列化和反序列化
前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、再谈协议…...
[前端开发] 常见的 HTML CSS JavaScript 事件
代码示例指路 常见的 HTML、CSS、JavaScript 事件代码示例 常见的 HTML CSS JavaScript 事件 事件HTML 事件鼠标事件键盘事件表单事件 JavaScript 事件对象事件代理(事件委托) 事件 在 Web 开发中,事件是用户与网页交互的重要方式之一。通过…...
H5/CSS 笔试面试考题(71-80)
简述哪种输入类型用于定义周和年控件(无时区)( ) A:date B:week C:year 面试通过率:67.0% 推荐指数: ★★★★★ 试题难度: 初级 试题类型: 选择题 答案:b 简述下列哪个元素表示外部资源?该元素可以被视为图像、嵌套的浏览上下文或插件要处理的资源。它包括各种属性…...

【Node.js】path 模块进行路径处理
Node.js 执行 JS 代码时,代码中的路径都是以终端所在文件夹出发查找相对路径,而不是以我们认为的从代码本身出发,会遇到问题,所以在 Node.js 要执行的代码中,访问其他文件,建议使用绝对路径 实例࿱…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...
Java多线程实现之Runnable接口深度解析
Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...