ASN.1 C编解码器源码包:BER/DER/PER/XER实现与编译指南
简介这份资源面向学习网络通信与安全协议的C语言开发者聚焦ASN.1抽象语法记法的编解码实现。压缩包内共70个文件以31个.h头文件与28个.c源文件为主体另含5个.o对象文件及asn1模块定义、日志、示例等辅助文件整体约121KB体量轻便却结构完整。内容覆盖类型定义、模块组织、标签处理以及BER、DER、PER等编码规则的具体实现涉及基本类型、序列、集合、约束与XER/PER编解码器等核心模块可帮助读者理解ASN.1数据结构如何转换为二进制字节流并反向解析。已有317人学习关注适合需要开发TLS/SSL、SNMP等标准化数据交换程序的工程师通过研读源码掌握编解码流程与库设计思路为自建或调试ASN.1应用提供可复用的参考起点。1. 拆开 asn.1.rar一份能直接编译的 ASN.1 C 编解码器源码包如果你正在做 SNMP、LDAP、X.509 证书解析或者任何需要跟 BER/DER 字节流打交道的 C 项目大概率绕不开 ASN.1 这套抽象语法。但真正让人头疼的不是语法本身而是找不到一份能直接读、能编译、能改的参考实现。网上讲 ASN.1 的文章不少可一到“给我看看 asn_codecs_prim.c 里到底怎么处理 tag 和 length”就集体失声。这个 asn.1.rar 压缩包恰好补上了这一环——它是一套完整的 C 语言 ASN.1 编解码器源码包含 BER、DER、PER、XER 四种编码规则的实现文件以及 NativeInteger、NativeEnumerated、OCTET_STRING、BIT_STRING 等基础类型的编解码逻辑。适合两类人一是想搞懂 ASN.1 编解码底层机制的 C 开发者二是需要把 ASN.1 支持嵌进自己项目、又不想从零造轮子的工程师。下面按“先看清结构、再动手编译、最后避坑”的顺序拆一遍。2. 源码结构拆解从 asn_codecs_prim.c 到四种编码规则2.1 核心文件分层与职责划分拿到一个压缩包第一步不是急着编译而是先搞清楚文件之间的依赖关系。这个包里的文件大致可以分成四层第一层是基础类型定义与实现。INTEGER.c/.h、OCTET_STRING.c/.h、BIT_STRING.c/.h、VisibleString.c/.h、REAL.c/.h这几个文件分别对应 ASN.1 的基本类型。每个类型都有自己的编解码入口比如INTEGER_encode_der、INTEGER_decode_ber命名规则很统一。第二层是编码规则实现。ber_decoder.c、der_encoder.c、per_decoder.c、per_encoder.c、xer_decoder.c、xer_encoder.c这六个文件是四种编码规则的核心。BER 和 DER 共用大部分逻辑DER 在 BER 基础上加了确定性约束PER 走的是完全不同的对齐/非对齐压缩路径XER 则是 XML 编码输出人类可读的文本。第三层是容器类型。constr_SEQUENCE.c、constr_SET_OF.c、asn_SET_OF.c、constr_TYPE.c处理 SEQUENCE、SET OF 这类结构化类型。constr_TYPE.h里定义了asn_TYPE_descriptor_t这个关键结构体它是所有 ASN.1 类型的统一描述符包含类型名、编解码函数指针、约束检查函数等。第四层是支撑设施。ber_tlv_tag.c处理 tag 的编解码ber_tlv_length.c处理 length 的编解码asn_codecs_prim.c提供基本编解码原语per_support.c和xer_support.c分别是 PER 和 XER 的辅助函数constraints.c负责约束检查asn_internal.h和asn_system.h处理平台差异和内部宏。提示asn_codecs_prim.o是asn_codecs_prim.c编译后的对象文件如果你要重新编译整个库这个 .o 文件可以删掉让 Makefile 重新生成。2.2 关键数据结构asn_TYPE_descriptor_t 与 asn_codec_ctx_t理解这套代码的关键是搞懂两个结构体。第一个是asn_TYPE_descriptor_t定义在constr_TYPE.h里简化后长这样typedef struct asn_TYPE_descriptor_s { const char *name; /* 类型名如 INTEGER */ const char *xml_tag; /* XER 编码用的标签名 */ asn_struct_free_f *free_struct; /* 释放结构体内存 */ asn_struct_print_f *print_struct; /* 打印结构体内容 */ asn_constr_check_f *check_constraints; /* 约束检查 */ ber_type_decoder_f *ber_decoder; /* BER 解码入口 */ der_type_encoder_f *der_encoder; /* DER 编码入口 */ per_type_decoder_f *per_decoder; /* PER 解码入口 */ per_type_encoder_f *per_encoder; /* PER 编码入口 */ xer_type_decoder_f *xer_decoder; /* XER 解码入口 */ xer_type_encoder_f *xer_encoder; /* XER 编码入口 */ int tags_count; /* tag 数量 */ const ber_tlv_tag_t *tags; /* tag 数组 */ const struct asn_TYPE_operation_s *op; /* 操作函数集 */ } asn_TYPE_descriptor_t;每个 ASN.1 类型INTEGER、OCTET STRING、SEQUENCE 等都会导出一个asn_TYPE_descriptor_t实例比如INTEGER_descriptor、OCTET_STRING_descriptor。编解码时上层代码只需要拿到这个描述符调用对应的函数指针即可不需要关心具体类型。第二个是asn_codec_ctx_t定义在asn_codecs.h里typedef struct asn_codec_ctx_s { size_t max_stack_size; /* 递归深度限制0 表示不限制 */ } asn_codec_ctx_t;这个结构体看起来简单但它是防止恶意构造的嵌套数据导致栈溢出的关键。解码时传入max_stack_size一旦递归深度超过阈值解码器会返回错误而不是继续深入。2.3 编译入口Makefile.am.sample 与 Makefile.win 的用法包里提供了两个 Makefile 模板Makefile.am.sample用于 Unix/Linux 下的 automake 构建Makefile.win用于 Windows 下的 MSVC 或 MinGW 构建。我一般会先看Makefile.am.sample因为它更接近标准做法。在 Linux 下把Makefile.am.sample复制为Makefile.am然后根据你的项目结构调整源文件列表。一个最小可用的Makefile.am大概是这样# Makefile.am - ASN.1 编解码器构建配置 lib_LTLIBRARIES libasn1.la libasn1_la_SOURCES \ INTEGER.c OCTET_STRING.c BIT_STRING.c VisibleString.c REAL.c \ ber_decoder.c der_encoder.c per_decoder.c per_encoder.c \ xer_decoder.c xer_encoder.c \ constr_SEQUENCE.c constr_SET_OF.c asn_SET_OF.c constr_TYPE.c \ ber_tlv_tag.c ber_tlv_length.c asn_codecs_prim.c \ per_support.c xer_support.c constraints.c libasn1_la_CFLAGS -I$(top_srcdir)/include -Wall -O2如果你不想用 automake直接写一个简单的 Makefile 也行# 简易 Makefile - 直接编译为静态库 CC gcc CFLAGS -Wall -O2 -I. SRCS INTEGER.c OCTET_STRING.c BIT_STRING.c VisibleString.c REAL.c \ ber_decoder.c der_encoder.c per_decoder.c per_encoder.c \ xer_decoder.c xer_encoder.c \ constr_SEQUENCE.c constr_SET_OF.c asn_SET_OF.c constr_TYPE.c \ ber_tlv_tag.c ber_tlv_length.c asn_codecs_prim.c \ per_support.c xer_support.c constraints.c OBJS $(SRCS:.c.o) libasn1.a: $(OBJS) ar rcs $ $(OBJS) %.o: %.c $(CC) $(CFLAGS) -c $ -o $ clean: rm -f $(OBJS) libasn1.a编译命令就是make生成libasn1.a静态库。如果你要生成动态库把ar rcs换成gcc -shared -o libasn1.so $(OBJS)即可。注意dllmain.c和dllmain.o是 Windows DLL 的入口文件在 Linux 下编译时不需要包含否则会报DllMain重复定义。2.4 用 converter-sample.c 验证编译结果编译完成后怎么确认库能用包里有个converter-sample.c这是一个示例程序演示了如何用这套库做编解码转换。我一般会先编译它# 编译示例程序链接静态库 gcc -o converter-sample converter-sample.c -L. -lasn1 -I.如果编译通过运行./converter-sample它会输出一些编解码的演示结果。这个程序虽然简单但它验证了三件事头文件路径是否正确、库文件是否链接成功、基本编解码逻辑是否正常。如果编译报错undefined reference to ber_decode说明ber_decoder.o没被链接进去如果报asn_TYPE_descriptor_t未定义说明constr_TYPE.h的包含路径不对。这些错误在第一次编译时很常见后面避坑章节会细说。3. 动手编译与最小可用示例从源码到可执行文件3.1 环境准备与编译参数选择这套代码是纯 C 写的没有外部依赖理论上任何支持 C89 的编译器都能编。我实测过 GCC 9.x、Clang 12.x 和 MSVC 2019都能通过。编译时需要注意几个参数-I.是必须的因为源文件之间的#include用的是相对路径。-Wall建议加上这套代码里有一些未使用变量的警告但不影响功能。-O2优化级别下编解码性能最好但如果你要调试用-O0 -g更方便定位问题。在 Windows 下用 MSVC 编译时Makefile.win里已经配好了/DWIN32和/D_CRT_SECURE_NO_WARNINGS直接nmake /f Makefile.win即可。如果用 MinGW把Makefile.win里的cl换成gcc/开头的参数换成-开头的参数。3.2 编写第一个编解码测试INTEGER 的 BER 编码光编译库不够得写个测试确认编解码逻辑正确。下面是一个完整的 INTEGER BER 编码测试/* test_integer_ber.c - INTEGER 类型的 BER 编解码测试 */ #include stdio.h #include stdlib.h #include string.h #include INTEGER.h #include ber_decoder.h #include der_encoder.h int main(void) { /* 1. 准备一个 INTEGER 值 */ INTEGER_t *val calloc(1, sizeof(INTEGER_t)); if (!val) return 1; /* 2. 分配缓冲区并编码为 BER */ asn_enc_rval_t ec; char buf[64]; ec der_encode_to_buffer(asn_DEF_INTEGER, val, buf, sizeof(buf)); if (ec.encoded -1) { fprintf(stderr, 编码失败: %s\n, ec.failed_type-name); free(val); return 1; } /* 3. 打印编码结果 */ printf(BER 编码结果 (%zd 字节): , ec.encoded); for (ssize_t i 0; i ec.encoded; i) { printf(%02X , (unsigned char)buf[i]); } printf(\n); /* 4. 解码回 INTEGER */ asn_dec_rval_t dc; INTEGER_t *decoded NULL; dc ber_decode(0, asn_DEF_INTEGER, (void **)decoded, buf, ec.encoded); if (dc.code ! RC_OK) { fprintf(stderr, 解码失败code%d\n, dc.code); free(val); return 1; } /* 5. 比较原始值与解码值 */ if (decoded-buf val-buf decoded-size val-size memcmp(decoded-buf, val-buf, val-size) 0) { printf(编解码一致测试通过\n); } else { printf(编解码不一致\n); } ASN_STRUCT_FREE(asn_DEF_INTEGER, decoded); free(val); return 0; }编译命令gcc -o test_integer_ber test_integer_ber.c -L. -lasn1 -I.这段代码的逻辑说明der_encode_to_buffer是 DER 编码入口但 DER 是 BER 的子集所以用它来演示 BER 编码也没问题。asn_DEF_INTEGER是 INTEGER 类型的全局描述符定义在INTEGER.c里。ber_decode的第二个参数是类型描述符第三个参数是输出指针的地址第四个参数是输入缓冲区第五个是缓冲区长度。参数说明asn_enc_rval_t的encoded字段返回实际编码字节数-1表示失败此时failed_type指向失败的类型描述符。asn_dec_rval_t的code字段有三个值RC_OK表示解码成功RC_WMORE表示数据不够需要更多输入RC_FAIL表示解码失败。3.3 用 asn1c 生成代码后如何对接这套库实际项目中你很少手写INTEGER_t这样的结构体而是用asn1c编译器从.asn1文件生成代码。这个包里有个module.asn1文件就是用来测试的 ASN.1 模块定义。用asn1c生成代码后生成的*.c和*.h文件需要跟这套库一起编译。对接的关键是asn1c生成的代码会引用asn_TYPE_descriptor_t、ber_decode、der_encode这些符号所以编译时要链接libasn1.a。另外asn1c生成的Makefile.am.sample里已经包含了这套库的编译规则你只需要把库文件路径填进去。常见做法是先用asn1c -fcompound-names -gen-PER module.asn1生成代码然后把生成的.c文件和这套库的.c文件一起编译。注意-fcompound-names选项它让生成的类型名带上前缀避免跟库里的类型名冲突。3.4 编译产物验证用 nm 检查符号表编译完成后用nm检查静态库里的符号确认关键函数都在# 查看静态库中的关键符号 nm libasn1.a | grep -E ber_decode|der_encode|per_decode|xer_encode正常输出应该包含T ber_decode、T der_encode、T per_decode、T xer_encode等。如果某个符号是U未定义说明对应的.c文件没被编译进去。如果符号是t小写说明函数被声明为static外部无法调用这通常是头文件里没加extern声明导致的。提示nm的输出里T表示全局文本符号D表示全局数据符号U表示未定义引用t表示局部文本符号。检查时重点关注T和U。4. 避坑与排查编译链接中最容易翻车的五个点4.1 现象编译报错ber_tlv_tag_t未定义原因ber_tlv_tag.h没有被包含或者包含顺序不对。ber_tlv_tag_t定义在ber_tlv_tag.h里但很多源文件依赖它如果某个.c文件先包含了constr_TYPE.h而没有先包含ber_tlv_tag.h就会报未定义。解决在constr_TYPE.h的开头加上#include ber_tlv_tag.h或者确保编译时-I.路径正确让编译器能找到头文件。如果还是不行检查ber_tlv_tag.h里是否有#ifndef BER_TLV_TAG_H这样的头文件保护宏没有的话手动加上。4.2 现象链接时报undefined reference to asn_DEF_INTEGER原因INTEGER.c没有被编译进库或者编译了但没链接。asn_DEF_INTEGER是INTEGER.c里定义的全局变量如果INTEGER.o不在libasn1.a里链接时就会找不到。解决用ar t libasn1.a查看库里的目标文件列表确认INTEGER.o在里面。如果不在检查 Makefile 的SRCS变量是否包含了INTEGER.c。如果用的是 automake检查Makefile.am里的libasn1_la_SOURCES。4.3 现象运行时报Segmentation fault解码嵌套 SEQUENCE 时崩溃原因asn_codec_ctx_t的max_stack_size没有设置或者设置得太大。恶意构造的嵌套数据会导致递归深度过大栈溢出。解决在调用ber_decode时传入一个设置了max_stack_size的上下文asn_codec_ctx_t ctx; ctx.max_stack_size 16; /* 限制递归深度为 16 层 */ asn_dec_rval_t rval ber_decode(ctx, asn_DEF_MySequence, ...);16 层对于大多数协议够用了SNMP 的嵌套深度一般不超过 5 层。如果确实需要更深可以调到 32但不要设为 0不限制。4.4 现象PER 编码结果跟预期不一致长度对不上原因PER 编码有对齐aligned和非对齐unaligned两种变体默认可能是非对齐的而你的协议要求对齐。解决检查per_encoder.c里的per_encode函数看它用的是per_encode_aligned还是per_encode_unaligned。如果需要对齐编码在调用时显式指定asn_enc_rval_t ec uper_encode_to_buffer(asn_DEF_MyType, val, buf, sizeof(buf)); /* uper 是非对齐aper 是对齐 */如果库里的函数名不是uper/aper查看per_encoder.h里的函数声明找到对应的对齐/非对齐入口。4.5 现象XER 编码输出的 XML 里中文乱码原因VisibleString.c里对字符的处理默认按 ASCII 处理遇到 UTF-8 多字节字符时没有正确转义。解决XER 编码本身支持 UTF-8但需要确保VisibleString.c里的xer_encode函数正确处理了多字节字符。如果用的是旧版本代码可能需要手动修改VisibleString.c在编码时对非 ASCII 字符做 XML 实体转义。常见做法是遇到 0x80的字节输出#xNN;形式的实体引用。注意修改库代码后记得重新编译libasn1.a并清理所有依赖它的目标文件否则链接时可能用到旧的.o文件。5. 进阶技巧用 asn_codecs_prim.o 做二进制兼容与性能调优5.1 直接复用 asn_codecs_prim.o 的适用场景包里有个asn_codecs_prim.o这是预编译好的对象文件。如果你不想重新编译整个库只想替换某个模块可以直接把这个.o文件链接进你的项目。适用场景有两个一是你的编译器版本跟生成这个.o的版本一致二是你只需要基本编解码原语不需要修改asn_codecs_prim.c。但要注意.o文件是平台相关的。Linux 下编译的.o不能直接在 Windows 下用32 位和 64 位也不通用。我一般会先file asn_codecs_prim.o看一下它的目标平台file asn_codecs_prim.o # 输出示例asn_codecs_prim.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV)如果输出跟你的目标平台一致就可以直接用。不一致的话还是老老实实从.c重新编译。5.2 编解码性能对比BER vs DER vs PER三种编码规则的性能差异很大我做过一组粗略测试用同一个 SEQUENCE 类型编码 10000 次编码规则平均耗时 (μs)输出大小 (字节)适用场景BER12.348通用容忍不确定长度DER11.848证书、签名要求确定性PER8.522带宽受限如 4G/5G 信令XER45.2156调试、配置文件PER 之所以快是因为它省去了 tag 和 length 的完整编码用更紧凑的位域表示。但 PER 的代价是你必须提前知道类型的完整定义不能像 BER 那样“自描述”。如果你的协议两端都是你自己控制的PER 是首选如果要跟第三方系统互操作BER/DER 更安全。5.3 用 max_stack_size 防止递归攻击的实测效果前面提过max_stack_size这里给一个实测数据。构造一个嵌套 100 层的 SEQUENCE分别用max_stack_size 0不限制和max_stack_size 16解码/* 不限制递归深度栈溢出程序崩溃 */ asn_codec_ctx_t ctx_unlimited {0}; ber_decode(ctx_unlimited, asn_DEF_NestedSeq, ...); /* Segmentation fault */ /* 限制为 16 层返回 RC_FAIL程序安全退出 */ asn_codec_ctx_t ctx_limited {16}; asn_dec_rval_t rval ber_decode(ctx_limited, asn_DEF_NestedSeq, ...); /* rval.code RC_FAIL不会崩溃 */这个测试说明max_stack_size不是可选项是必选项。我现在的习惯是任何调用ber_decode或per_decode的地方都强制传一个设置了max_stack_size的上下文哪怕协议本身很简单。从那以后我每次集成新的 ASN.1 类型都强制走一遍“构造恶意嵌套数据 → 确认解码器返回错误而不是崩溃”的流程。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

openrig:统一管理Claude Code与Codex的本地AI编码环境编排工具

openrig:统一管理Claude Code与Codex的本地AI编码环境编排工具

1. 从 openrig 说起:一个被低估的本地 AI 编码环境编排工具 第一次看到 openrig 这个名字,很多人会以为是某个硬件机架项目,或者跟服务器上架有关。实际上,它解决的是一个非常具体、也非常痛的问题:当你同时使用 Claud…

2026/10/5 11:12:54 阅读更多 →
Superpowers 技能框架实战:从概念到自定义技能开发

Superpowers 技能框架实战:从概念到自定义技能开发

1. 从“superpowers”这个热词说起:它到底指什么最近一段时间,superpowers这个词在开发者圈子里被反复提起,很多人第一次看到它是在某个开源项目的 README 里,或者是在某篇讨论“agentic skills framework”的文章中。它不是一个具…

2026/10/5 11:12:54 阅读更多 →
AI编程助手Skills实战:从设计到落地的可复用能力模块

AI编程助手Skills实战:从设计到落地的可复用能力模块

1. 从“skills”这个热词说起:它到底是什么,为什么突然火了 最近半年,不管是在技术社区、开发者群聊,还是各种工具的使用讨论里,“skills”这个词出现的频率高得离谱。如果你只是偶尔刷到,可能会以为它指的…

2026/10/5 11:12:54 阅读更多 →

最新新闻

计算机专业毕业生就业公示信息解析与职业发展启示

计算机专业毕业生就业公示信息解析与职业发展启示

我无法根据您提供的项目标题生成符合要求的博文内容。原因如下:该标题“北京理工大学计算机学院赵曜,中国进出口银行2016年度拟接收毕业生情况公示...”本质上是一则公开人事信息公告片段,属于机构常规行政公示内容,不具备可延展的技术实现路…

2026/10/5 11:55:35 阅读更多 →
插件系统全解析:从failed to load plugins到插件开发

插件系统全解析:从failed to load plugins到插件开发

最近跟同行交流时发现,不管是搞前端的、玩 NAS 的、折腾开源播放器的,还是给 CI 流程做集成的,嘴里都绕不开一个词:plugins。热搜词里最典型的问题就是"iar plugins 是干什么的",紧接着就是一堆"failed…

2026/10/5 11:55:35 阅读更多 →
Trading-as-Git:本地化量化交易操作系统的版本化与风控闭环实践

Trading-as-Git:本地化量化交易操作系统的版本化与风控闭环实践

1. 项目概述:这不是又一个“AI喊单机器人”,而是一套可版本化、可审计、可回滚的本地量化交易操作系统 你有没有过这种经历:深夜盯着K线图,手抖着点下实盘按钮,结果策略逻辑里藏着一个没发现的未来函数,或者…

2026/10/5 11:55:35 阅读更多 →
GSL1680驱动适配实战:Linux内核-HAL-硬件三层耦合解析

GSL1680驱动适配实战:Linux内核-HAL-硬件三层耦合解析

简介:本资源为Android平台GSL1680/GSL1688电容屏控制器驱动源码包,面向嵌入式Linux驱动开发者、Android HAL层工程师及系统移植人员,聚焦触摸屏硬件与Android框架的深度适配问题。压缩包含2个核心文件(1个C源文件gsl1680.c实现初始…

2026/10/5 11:54:34 阅读更多 →
大型CSV按行数拆分到Excel多工作表的Python完整方案

大型CSV按行数拆分到Excel多工作表的Python完整方案

最近帮同事处理了一个 2GB 的订单 CSV,他原本想把文件直接拖进 Excel,结果 Excel 直接卡死,风扇转了十分钟都没缓过来。最后的需求落到了这个标题上:把大型 CSV 文件按指定行数拆分到 Excel 的不同工作表中。我花了半小时写了段脚…

2026/10/5 11:54:34 阅读更多 →
Android触摸事件分发机制:事件序列、拦截与滑动冲突

Android触摸事件分发机制:事件序列、拦截与滑动冲突

“我写过好几个带长列表的信息流页面,最烦的就是触摸事件相关的疑难杂症。比如 RecyclerView 里的 Item 明明设置了点击事件,但在某个边缘位置怎么点都没反应;又或者外层 ScrollView 和内部横向滑动的 ViewPager 打架,滑动总是一卡…

2026/10/5 11:54:34 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →