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

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库&#xff0c;极其轻量 仅1个四百多行源码的源文件&#xff0c;和1个头文件 支持对象、数组、数值、字符串类型 github仓库 头文件 对主要的json API的声明 #ifndef ARCOJSON_ARCOJSON_H #defin…...

Linux操作系统基础(七):Linux常见命令(二)

文章目录 Linux常见命令&#xff08;二&#xff09; 一、kill命令 二、ifconfig命令 三、clear命令 四、重启与关机命令 五、which命令 六、hostname命令 七、grep命令 八、|管道 九、useradd命令 十、userdel命令 十一、tar命令 十二、su命令 十三、ps命令 Linu…...

进程状态

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

STM32固件库简介与使用指南

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

【开源】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 课程评价表 四、系统展示五、核心代…...

融资项目——获取树形结构的数据

如下图所示&#xff0c;下列数据是一个树形结构数据&#xff0c;行业中包含若干子节点。表的设计如下图&#xff0c;设置了一个id为1的虚拟根节点。&#xff08;本树形结构带虚拟根节点共三层&#xff09; 实现逻辑&#xff1a; 延时展示方法&#xff0c;先展现第二层的信息&a…...

Crypto-RSA2

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

IEEE Internet of Things Journal投稿经验

期刊名&#xff1a;IEEE Internet of Things Journal 期刊分区&#xff1a;中科院一区 Top 影响因子&#xff1a;10.6 投稿状态 &#xff08;1&#xff09;2023.11.3&#xff0c;投稿成功&#xff0c;状态为&#xff1a;under review&#xff08;大u大r&#xff09;&#xff1…...

实例分割论文阅读之:FCN:《Fully Convolutional Networks for Semantica Segmentation》

论文地址:https://openaccess.thecvf.com/content_cvpr_2015/papers/Long_Fully_Convolutional_Networks_2015_CVPR_paper.pdf 代码链接&#xff1a;https://github.com/pytorch/vision 摘要 卷积网络是强大的视觉模型&#xff0c;可以产生特征层次结构。我们证明&#xff0c…...

apk反编译修改教程系列---简单去除apk登陆 修改vip与一些反编译基础常识【十二】

往期教程&#xff1a; 安卓玩机-----反编译apk 修改apk 去广告 去弹窗等操作中的一些常识apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中…...

网络安全习题集

第一章 绪论 4 ISO / OSI 安全体系结构中的对象认证安全服务使用&#xff08; C ) 机制来完成。 A &#xff0e;访问控制 B &#xff0e;加密 C &#xff0e;数字签名 D &#xff0e;数据完整性 5 身份鉴别是安全服务中的重要一环&#xff0c;以下关于身份鉴别的叙述不正确的是…...

C++中的volatile:穿越编译器的屏障

C中的volatile&#xff1a;穿越编译器的屏障 在C编程中&#xff0c;我们经常会遇到需要与硬件交互或多线程环境下访问共享数据的情况。为了确保程序的正确性和可预测性&#xff0c;C提供了关键字volatile来修饰变量。本文将深入解析C中的volatile关键字&#xff0c;介绍其作用、…...

(07)Hive——窗口函数详解

一、 窗口函数知识点 1.1 窗户函数的定义 窗口函数可以拆分为【窗口函数】。窗口函数官网指路&#xff1a; LanguageManual WindowingAndAnalytics - Apache Hive - Apache Software Foundationhttps://cwiki.apache.org/confluence/display/Hive/LanguageManual%20Windowing…...

【开源图床】使用Typora+PicGo+Github+CDN搭建个人博客图床

准备工作&#xff1a; 首先电脑得提前完成安装如下&#xff1a; 1. nodejs环境(node ,npm):【安装指南】nodejs下载、安装与配置详细教程 2. Picgo:【安装指南】图床神器之Picgo下载、安装与配置详细教程 3. Typora:【安装指南】markdown神器之Typora下载、安装与无限使用详细教…...

阅读笔记(SOFT COMPUTING 2018)Seam elimination based on Curvelet for image stitching

参考文献&#xff1a; Wang Z, Yang Z. Seam elimination based on Curvelet for image stitching[J]. Soft Computing, 2018: 1-16. 注&#xff1a;SOFT COMPUTING 大类学科小类学科Top期刊综述期刊工程技术 3区 COMPUTER SCIENCE, ARTIFICIAL INTELLIGENCE 计算机&#xf…...

LinkedList数据结构链表

LinkedList在Java中是一个实现了List和Deque接口的双向链表。它允许我们在列表的两端添加或删除元素&#xff0c;同时也支持在列表中间插入或移除元素。在分析LinkedList之前&#xff0c;需要理解链表这种数据结构&#xff1a; 链表&#xff1a;链表是一种动态数据结构&#x…...

[计算机网络]---序列化和反序列化

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、再谈协议…...

[前端开发] 常见的 HTML CSS JavaScript 事件

代码示例指路 常见的 HTML、CSS、JavaScript 事件代码示例 常见的 HTML CSS JavaScript 事件 事件HTML 事件鼠标事件键盘事件表单事件 JavaScript 事件对象事件代理&#xff08;事件委托&#xff09; 事件 在 Web 开发中&#xff0c;事件是用户与网页交互的重要方式之一。通过…...

H5/CSS 笔试面试考题(71-80)

简述哪种输入类型用于定义周和年控件(无时区)( ) A:date B:week C:year 面试通过率:67.0% 推荐指数: ★★★★★ 试题难度: 初级 试题类型: 选择题 答案:b 简述下列哪个元素表示外部资源?该元素可以被视为图像、嵌套的浏览上下文或插件要处理的资源。它包括各种属性…...

【Node.js】path 模块进行路径处理

Node.js 执行 JS 代码时&#xff0c;代码中的路径都是以终端所在文件夹出发查找相对路径&#xff0c;而不是以我们认为的从代码本身出发&#xff0c;会遇到问题&#xff0c;所以在 Node.js 要执行的代码中&#xff0c;访问其他文件&#xff0c;建议使用绝对路径 实例&#xff1…...

react+ts【项目实战一】配置项目/路由/redux

文章目录 1、项目搭建1、创建项目1.2 配置项目1.2.1 更换icon1.2.2 更换项目名称1.2.1 配置项目别名 1.3 代码规范1.3.1 集成editorconfig配置1.3.2 使用prettier工具 1.4 项目结构1.5 对css进行重置1.6 注入router1.7 定义TS组件的规范1.8 创建代码片段1.9 二级路由和懒加载1.…...

英文论文(sci)解读复现【NO.20】TPH-YOLOv5++:增强捕获无人机的目标检测跨层不对称变压器的场景

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…...

第十五章 以编程方式使用 SQL 网关 - %SQLGatewayConnection 方法和属性

文章目录 第十五章 以编程方式使用 SQL 网关 - %SQLGatewayConnection 方法和属性FetchRows()GatewayStatus propertyGatewayStatusGet()GetConnection()GetGTWVersion()GetLastSQLCode() 第十五章 以编程方式使用 SQL 网关 - %SQLGatewayConnection 方法和属性 FetchRows() …...

【QTableView】

QTableView是Qt框架中用于显示表格形式数据的部件,通常用于显示数据库查询结果、数据集以及其他类似的结构化数据。 以下是一个使用QTableView的简单示例,假设我们有一个数据库表存储了学生的信息,我们可以使用QSqlTableModel将数据库表关联到QTableView上,并显示出来: …...

VS-Code-C#配置

C#开发环境配置 查看更多学习笔记&#xff1a;GitHub&#xff1a;LoveEmiliaForever 1. 安装 .NET SDK 官方下载网址按照安装程序指引安装即可 2. VS Code 安装插件 插件名&#xff1a;C#发布者是Microsoft 该插件是基础语法插件 插件名&#xff1a;C# Dev Kit发布者是Mic…...

第七篇【传奇开心果系列】Python微项目技术点案例示例:数据可视化界面图形化经典案例

传奇开心果微博系列 系列微博目录Python微项目技术点案例示例系列 微博目录一、微项目开发背景和项目目标&#xff1a;二、雏形示例代码三、扩展思路介绍四、数据输入示例代码五、数据分析示例代码六、排名统计示例代码七、数据导入导出示例代码八、主题定制示例代码九、数据过…...

LeetCode 第33天 | 1005. K 次取反后最大化的数组和 135. 分发糖果 134. 加油站

1005. K 次取反后最大化的数组和 按照绝对值大小降序排序&#xff0c;然后将负值变正&#xff0c;如果所有负值都正了&#xff0c;但是还有k余量且为奇数&#xff0c;那就将绝对值最小值&#xff08;最后一个元素&#xff09;取反&#xff0c;否则直接结束。 class Solution {…...

PointMixer论文阅读笔记

MLP-mixer是最近很流行的一种网络结构&#xff0c;比起Transformer和CNN的节构笨重&#xff0c;MLP-mixer不仅节构简单&#xff0c;而且在图像识别方面表现优异。但是MLP-mixer在点云识别方面表现欠佳&#xff0c;PointMixer就是在保留了MLP-mixer优点的同时&#xff0c;还可以…...

[word] word分割线在哪里设置 #其他#经验分享

word分割线在哪里设置 在工作中有些技巧&#xff0c;可以快速提高工作效率&#xff0c;解决大部分工作&#xff0c;今天给大家分享word分割线在哪里设置的小技能&#xff0c;希望可以帮助到你。 1、快速输入分割线 输入三个【_】按下回车就是一条长直线&#xff0c;同样分别…...

C++ 音视频原理

本篇文章我们来描述一下音视频原理 音视频录制原理: 下面是对这张思维导图的介绍 摄像头部分: 麦克风采集声音 摄像头采集画面 摄像头采集回来的数据可以用RGB也可以用YUV来表示 图像帧帧率 一秒能处理多少张图像 图像处理 &#xff1a;调亮度 图像帧队列 :意思是将数据取…...

C# 只允许开启一个exe程序

C# 只允许开启一个exe程序 第一种方法 电脑只能启动一次再次点击显示当前exe程序 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; using System.Threading.Tasks; using System.Win…...

【Java程序员面试专栏 分布式中间件】Redis 核心面试指引

关于Redis部分的核心知识进行一网打尽,包括Redis的基本概念,基本架构,工作流程,存储机制等,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 基础概念 明确redis的特性、应用场景和数据结构 什么是Redis,Redis有哪些应用场景 Redi…...

2024年【高处安装、维护、拆除】模拟考试题库及高处安装、维护、拆除实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 高处安装、维护、拆除模拟考试题库是安全生产模拟考试一点通生成的&#xff0c;高处安装、维护、拆除证模拟考试题库是根据高处安装、维护、拆除最新版教材汇编出高处安装、维护、拆除仿真模拟考试。2024年【高处安装…...

【QT+QGIS跨平台编译】之三十七:【Shapelib+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、Shapelib介绍二、Shapelib下载三、文件分析四、pro文件五、编译实践一、Shapelib介绍 Shapelib是一个开源的C库,用于读取、写入和操作ESRI Shapefile格式的地理矢量数据。 ESRI Shapefile是一种常见的地理信息系统(GIS)文件格式,用于存储地理矢量数据,包括…...

【机器学习基础】决策树(Decision Tree)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ ⭐特别提醒&#xff1a;针对机器学习&#xff0c;特别开始专栏&#xff1a;机器学习python实战 欢迎订阅&am…...

图神经网络DGL框架,graph classification,多个且不同维度的node feature 训练

node feature 维度不同 我现在有许多不同的图要加入训练&#xff0c;每个图的节点特征维度不同&#xff0c;第一张图n_weight特征有10条数据&#xff0c;第二张图n_weight特征有15条数据&#xff0c;但是训练的时候&#xff0c;需要维度都对其&#xff0c;所以直接做0 padding…...

蓝桥杯(Web大学组)2022国赛真题:用什么来做计算 A

判分标准 实现重置&#xff08;AC&#xff09;功能&#xff0c;得 1 分。 实现计算式子和结果显示功能&#xff0c;得 3 分。 实现计算功能&#xff0c;得 6 分。 应该按要求来就行吧&#xff0c;&#xff0c;一开始还在想是否要考虑小数点个数的问题还有式子是否有效…… 笔记…...

Linux POSIX信号量 线程池

Linux POSIX信号量 线程池 一. 什么是POSIX信号量&#xff1f;二. POSIX信号量实现原理三. POSIX信号量接口函数四. 基于环形队列的生产消费模型五. 线程池 一. 什么是POSIX信号量&#xff1f; POSIX信号量是一种用于同步和互斥操作的机制&#xff0c;属于POSIX&#xff08;Po…...

Sentinel(理论版)

Sentinel 1.什么是Sentinel Sentinel 是一个开源的流量控制组件&#xff0c;它主要用于在分布式系统中实现稳定性与可靠性&#xff0c;如流量控制、熔断降级、系统负载保护等功能。简单来说&#xff0c;Sentinel 就像是一个交通警察&#xff0c;它可以根据系统的实时流量&…...

python3 获取某个文件夹所有的pdf文件表格提取表格并一起合并到excel文件

下面是一个完整的示例&#xff0c;其中包括了merge_tables_to_excel函数的定义&#xff0c;并且假设该函数的功能是从每个PDF文件中提取第一个表格并将其合并到一个Excel文件中&#xff1a; import os from pathlib import Path import pandas as pd import pdfplumber …...

【AIGC】Stable Diffusion的模型入门

下载好相关模型文件后&#xff0c;直接放入Stable Diffusion相关目录即可使用&#xff0c;Stable Diffusion 模型就是我们日常所说的大模型&#xff0c;下载后放入**\webui\models\Stable-diffusion**目录&#xff0c;界面上就会展示相应的模型选项&#xff0c;如下图所示。作者…...

【JavaEE】_HTTP请求首行详情

目录 1. URL 2. 方法 2.1 GET方法 2.2 POST方法 2.3 GET与POST的区别 2.4 低频使用方法 1. URL 在mysql JDBC中已经提到过URL的相关概念&#xff1a; 如需查看有关JDBC更多内容&#xff0c;原文链接如下&#xff1a; 【MySQL】_JDBC编程-CSDN博客 URL用于描述某个资源…...

Linux第48步_编译正点原子的出厂Linux内核源码

编译正点原子的出厂 Linux 内核源码&#xff0c;为后面移植linux做准备。研究对象如下&#xff1a; 1)、linux内核镜像文件“uImage” 路径为“arch/arm/boot”&#xff1b; 2)、设备树文件“stm32mp157d-atk.dtb” 路径为“arch/arm/boot/dts” 3)、默认配置文件“stm32m…...

程序员为什么不喜欢关电脑?

程序员为什么不喜欢关电脑&#xff1f; 本人40 最近待业。&#xff0c;希望 3月前能再就业吧&#xff01;就不喜欢关电脑 这个问题来说是不好习惯。毕竟你的电脑不是服务器&#xff0c;哈哈。但是程序员都很懒&#xff0c;能自动化的&#xff0c;就让机器干。我在此之前 也工作…...

【初始RabbitMQ】了解和安装RabbitMQ

RabbitMQ的概念 RabbitMQ是一个消息中间件&#xff1a;他可以接受并转发消息。例如你可以把它当做一个快递站点&#xff0c;当你要发送一个包 裹时&#xff0c;你把你的包裹放到快递站&#xff0c;快递员最终会把你的快递送到收件人那里&#xff0c;按照这种逻辑 RabbitMQ 是 …...

Linux第56步_根文件系统第3步_将busybox构建的根文件系统烧录到EMMC

1、第1次将“rootfs”打包 1)、打开第1个终端&#xff0c;准备在“mnt”目录下创建挂载目录“rootfs”&#xff1b; 输入“ls回车” 输入“cd /mnt回车” 输入“ls回车”&#xff0c;查看“mnt”目录下的文件和文件夹 输入“sudo mkdir rootfs回车”&#xff0c;在“mnt”…...

Linux进程间通信(三)-----System V消息队列

消息队列的概念及原理 消息队列实际上就是在系统当中创建了一个队列&#xff0c;队列当中的每个成员都是一个数据块&#xff0c;这些数据块都由类型和信息两部分构成&#xff0c;两个互相通信的进程通过某种方式看到同一个消息队列&#xff0c;这两个进程向对方发数据时&#x…...

Elasticsearch:混合搜索是 GenAI 应用的未来

在这个竞争激烈的人工智能时代&#xff0c;自动化和数据为王。 从庞大的存储库中有效地自动化搜索和检索信息的过程的能力变得至关重要。 随着技术的进步&#xff0c;信息检索方法也在不断进步&#xff0c;从而导致了各种搜索机制的发展。 随着生成式人工智能模型成为吸引力的中…...

态、势、感、知的偏序、全序与无序

在态势感知中&#xff0c;"态"、"势"、"感"和"知"可以被理解为描述不同层次的概念。而在偏序、全序和无序方面&#xff0c;它们可以有不同的关系&#xff0c;简单地说&#xff0c;偏序关系表示部分的可比较性&#xff0c;全序关系表示…...

【从Python基础到深度学习】 8. VIM两种状态

一、安装 sudo apt install vim 二、VIM两种模式 - 命令状态/编辑状态 1.1 进入/退出VIM 进入VIM vim 退出vim :q <enter> 2.2 根目录下添加配置文件 window下创建vimrc类型文件内容如下&#xff1a; set nu set cursorline set hlsearch set tabstop4 使用Wins…...