MATLAB解析ELF目标文件.o:从魔数到符号表的纯脚本实现
简介本资源是一份面向MATLAB初学者与GPS数据处理学习者的实用工具包聚焦RINEX观测文件.o格式的解析与读取解决科研与工程中GPS原始观测数据难以直接导入MATLAB分析的痛点适用于大地测量、导航定位、时间同步等方向的数据预处理环节。压缩包为ZIP格式共2个文件1个MATLAB函数源码.m用于解析RINEX观测文件头及正文结构含完整注释与错误处理逻辑1个ASV格式示例RINEX观测文件ASCII文本便于调试验证整体仅2KB轻量易用。目前已有1508人学习下载说明其在小众但高需求场景中具备较强实操参考价值。用户可直接复用rinexomessage.m脚本完成文件打开、头信息提取、观测值伪距、载波相位等结构化解析并基于返回数据开展后续定位解算或误差建模是理解RINEX标准与MATLAB底层文件IO结合的典型入门范例。1. MATLAB读取.o文件不是“直接打开”而是解析目标文件二进制结构的逆向工程你手头有个.o文件——比如从某嵌入式工具链导出的目标文件或是某C/C项目编译中途生成的中间产物现在想在MATLAB里“读进来”做后续分析查符号表、提取重定位项、验证段布局、甚至反推原始变量地址。但敲load(xxx.o)或fopen(xxx.o,r)立刻报错用importdata只读出乱码readmatrix直接崩溃。这不是MATLAB“不支持”而是你正站在ELF或COFF二进制格式的门口却试图用文本编辑器的逻辑去开门。.o是编译器输出的重定位目标文件本质是结构化二进制容器含节头、程序头、符号表、字符串表、重定位表等多层嵌套元数据。MATLAB原生不提供objdump级解析能力但完全可借助其底层字节操作标准格式规范System V ABI / ELF64/32 spec手动逐段解包。本文面向需要在MATLAB中完成嵌入式固件分析、编译流程验证、或跨平台二进制审计的工程师——不依赖外部命令行工具不调用系统objdump纯MATLAB脚本实现.o文件关键信息提取。重点不是“能不能读”而是“读什么、怎么读准、哪些字段真有用”。2. 为什么不能直接load先看.o文件的真实结构与MATLAB的边界2.1 .o文件不是数据文件而是符合ABI规范的二进制容器.o文件目标文件遵循标准二进制格式主流为ELFExecutable and Linkable FormatLinux/Unix/macOS或COFFCommon Object File FormatWindows旧工具链。以最常见的64位ELF为例其结构严格分层ELF Header64字节魔数\x7fELF、位宽、字节序、类型ET_REL表示重定位文件、机器架构EM_X86_64等Section Header Table描述所有节.text,.data,.symtab,.strtab,.rela.text等的名称、偏移、大小、标志Sections themselves各节原始内容如代码段二进制、数据段初始值、符号表结构数组、字符串表明文Symbol Table.symtab每个符号条目含名称索引、值地址/偏移、大小、绑定、类型、节索引String Table.strtab所有符号名、节名拼接的连续字符串通过索引访问。MATLAB的load()、readtable()等函数默认按文本或矩阵格式解析对这种无分隔符、混合整数/字符串/指针的紧凑二进制束完全失效。强行fread(fid, uint8)能读出字节流但若不解析头部你连“第1024字节是符号名还是重定位加数”都无从判断。2.2 MATLAB的可行路径字节级IO 格式手册驱动解析MATLAB虽无内置ELF库但具备完备的二进制IO能力fopen/fread/fseek支持任意偏移读取typecast可在uint8与uint32/uint64/int32间无损转换注意字节序char()可将uint8数组转为字符串需配合.strtab索引结构体struct可封装节头、符号条目等复合数据。关键在于你必须自己实现ELF Header解析、节头表遍历、符号表索引映射。这不是“调个函数”而是按 https://refspecs.linuxfoundation.org/elf/elf.pdf System V ABI ELF Specification逐字段对照实现。好消息是核心结构固定且.o文件不含程序头PT_*比可执行文件更简单——我们只处理ET_REL类型。2.3 验证你的.o是否为ELF三行命令快速判别在终端非MATLAB运行以下命令确认格式避免后续白忙file your_file.o # 输出应含 ELF 64-bit LSB relocatable, x86-64 或类似 xxd -l 16 your_file.o | head -1 # 前4字节应为 7f 45 4c 46即 \x7fELF若输出为COFF或Mach-O则需切换解析逻辑本文聚焦ELF因占95%以上场景。Windows下MSVC生成的.obj属COFF需另写read_coff_header函数——但原理一致查魔数、读头长、跳转节表。提示不要假设所有.o都是ELF。某些交叉编译器如ARM GCC可能输出-m32的32位ELF而主机MATLAB是64位——此时uint32读取正确uint64会越界。务必先读ELF Header的e_ident[EI_CLASS]偏移4132位264位。3. 手动解析ELF .o文件从魔数到符号表的完整MATLAB实现3.1 步骤1打开文件并验证ELF魔数与基础属性function elf read_elf_header(filename) fid fopen(filename, r); if fid -1 error(无法打开文件: %s, filename); end % 读取前16字节e_ident区域 ident fread(fid, 16, uint8); % 检查魔数 \x7fELF if ~isequal(ident(1:4), [127, 69, 76, 70]) fclose(fid); error(文件不是ELF格式前4字节不是 7f 45 4c 46); end % 解析e_ident关键字段偏移4起 class_type ident(5); % EI_CLASS: 132-bit, 264-bit data_enc ident(6); % EI_DATA: 1little-endian, 2big-endian version ident(7); % EI_VERSION: 应为1 % 定位e_type (object type) 和 e_machine (architecture) % 对于64位ELFe_type在偏移16占2字节e_machine在偏移18占2字节 % 对于32位ELFe_type在偏移16e_machine在偏移18 —— 位置相同 fseek(fid, 16, bof); e_type fread(fid, 1, uint16); e_machine fread(fid, 1, uint16); % 验证是否为重定位文件ET_REL if e_type ~ 1 fclose(fid); error(文件类型非重定位目标文件ET_RELe_type%d, e_type); end % 构建返回结构体 elf.filename filename; elf.is_64bit (class_type 2); elf.is_little_endian (data_enc 1); elf.e_type e_type; elf.e_machine e_machine; elf.endian_suffix elf.is_little_endian ? little : big; fclose(fid); end逻辑说明此函数不读全头只抓关键判别字段。e_ident是ELF的“身份证”e_type1确保是.o非可执行/共享库e_machine后续用于校验符号类型兼容性如EM_ARMvsEM_X86_64。endian_suffix决定后续所有多字节读取的typecast方向。3.2 步骤2定位并读取节头表Section Header Table节头表是“.o文件的地图”告诉你每个节在哪、多大、叫什么。其位置由ELF Header的e_shoff节头表偏移、e_shnum节数、e_shentsize每项字节数给出。64位ELF中e_shoff在偏移40uint64e_shnum在偏移48uint16e_shentsize在偏移58uint16。function sections read_section_headers(elf) fid fopen(elf.filename, r); if fid -1, error(无法重开文件); end % 跳转到ELF Header末尾读取e_shoff等字段 if elf.is_64bit fseek(fid, 40, bof); % e_shoff offset for 64-bit e_shoff fread(fid, 1, uint64uint64); fseek(fid, 48, bof); % e_shnum offset e_shnum fread(fid, 1, uint16uint16); fseek(fid, 58, bof); % e_shentsize offset e_shentsize fread(fid, 1, uint16uint16); else fseek(fid, 32, bof); % e_shoff for 32-bit e_shoff fread(fid, 1, uint32uint32); fseek(fid, 44, bof); % e_shnum for 32-bit e_shnum fread(fid, 1, uint16uint16); fseek(fid, 46, bof); % e_shentsize for 32-bit e_shentsize fread(fid, 1, uint16uint16); end % 跳至节头表起始 fseek(fid, e_shoff, bof); % 读取所有节头条目每个e_shentsize字节 section_data fread(fid, e_shnum * e_shentsize, uint8); fclose(fid); % 解析每个节头64位ELF节头为64字节含sh_name, sh_type, sh_flags等 sections struct(); for i 1:e_shnum start_idx (i-1)*e_shentsize 1; % 提取sh_name节名在.strtab中的索引 if elf.is_64bit sh_name typecast(section_data(start_idx:start_idx3), uint32); else sh_name typecast(section_data(start_idx:start_idx3), uint32); end % sh_type节类型如SHT_SYMTAB2 if elf.is_64bit sh_type typecast(section_data(start_idx4:start_idx7), uint32); else sh_type typecast(section_data(start_idx4:start_idx7), uint32); end % sh_offset节内容在文件中的偏移 if elf.is_64bit sh_offset typecast(section_data(start_idx24:start_idx31), uint64); else sh_offset typecast(section_data(start_idx16:start_idx19), uint32); end % sh_size节大小 if elf.is_64bit sh_size typecast(section_data(start_idx32:start_idx39), uint64); else sh_size typecast(section_data(start_idx20:start_idx23), uint32); end % 存储为结构体字段简化版仅存关键字段 sections(i).name_index sh_name; sections(i).type sh_type; sections(i).offset sh_offset; sections(i).size sh_size; end end参数说明e_shentsize通常为6464位或4032位但必须从Header读取不可硬编码。sh_name是索引不是名字本身——它指向.shstrtab节中的字符串需二次读取。此处暂存索引后续用。3.3 步骤3提取节名字符串表.shstrtab并解析真实节名节头中的sh_name是.shstrtab节内偏移需先找到.shstrtab节再读其内容function shstrtab read_shstrtab(elf, sections) % 查找类型为SHT_STRTAB且名称为.shstrtab的节 shstrtab_idx []; for i 1:length(sections) if sections(i).type 3 % SHT_STRTAB 3 % 读取该节内容检查是否为.shstrtab fid fopen(elf.filename, r); fseek(fid, sections(i).offset, bof); content fread(fid, sections(i).size, uint8); fclose(fid); % 尝试解析为字符串以\x00分隔 str_content char(content); if contains(str_content, .shstrtab) shstrtab_idx i; shstrtab content; return; end end end error(未找到.shstrtab节); end function section_names resolve_section_names(elf, sections, shstrtab) section_names cell(length(sections), 1); for i 1:length(sections) idx sections(i).name_index; if idx 0 section_names{i} ; continue; end % 在shstrtab中查找\x00终止的字符串 end_pos find(shstrtab(idx:end) 0, 1, first); if isempty(end_pos) section_names{i} sprintf(name_%d, idx); else section_names{i} char(shstrtab(idx:idxend_pos-1)); end end end关键点.shstrtab是节名的“字典”sh_name是页码。resolve_section_names将所有节头的name_index转为可读名如.text,.symtab这是后续定位符号表的前提。4. 避坑解析.o文件时MATLAB最常翻车的5个血泪现场4.1 现象fread读出的数值全是0或极大值原因字节序endianness错误。ELF文件在x86_64上几乎全是小端little-endian但MATLABfread(fid, N, uint32)默认按主机序读。若MATLAB运行在Big-Endian主机罕见但存在或你误用uint32uint32而未指定后缀会导致4字节被反向解释。例如0x00000001读成0x01000000 16777216。解决强制指定字节序后缀。fread(fid, 1, uint32uint32)中的uint32表示“转为uint32”但不改变字节序应使用uint32uint32, l小端或b大端。更稳妥的是先fread为uint8再typecast并指定uint32和littlebytes fread(fid, 4, uint8); val typecast(bytes, uint32, little); % 显式小端4.2 现象符号表读出来名称全是乱码或空字符串原因混淆了.shstrtab节名表和.strtab符号名表。.symtab节中的每个符号条目含st_name字段它是.strtab节内的索引而非.shstrtab。若用.shstrtab去解析符号名必然失败。解决必须先定位.strtab节sh_type3且名称为.strtab再用符号的st_name索引它。注意一个文件可能有多个字符串表.shstrtab,.strtab,.comment需严格按名称匹配。4.3 现象sh_offset指向的位置读不到数据fread返回空原因sh_offset是文件内偏移但某些节如SHT_NOBITS类型在文件中不占空间如.bsssh_size非零但sh_offset可能为0或无效。.o文件中.bss节常见于此列。解决读取前检查sh_type。若sh_type 8SHT_NOBITS则该节无文件内容sh_size仅为内存占用大小跳过读取。仅对SHT_PROGBITS代码/数据、SHT_SYMTAB符号表、SHT_STRTAB字符串表等实际存储数据的节进行fread。4.4 现象符号地址st_value全为0无法定位变量原因.o是重定位文件所有符号地址在链接前均为0或相对偏移。st_value字段在.o中通常为0全局符号或节内偏移局部符号不代表最终加载地址。你看到的0是正常的不是解析错误。解决接受这一事实。若需真实地址必须进行链接生成.elf可执行文件后再解析或在MATLAB中模拟重定位读取.rela.text等重定位节将R_X86_64_32等重定位项应用到st_value上。这已超出本文范围但需知.o中st_value0不等于“符号不存在”。4.5 现象fopen失败提示“Permission denied”或文件被占用原因.o文件被编译进程如gcc、make独占锁定尤其在Windows上。MATLAB尝试读取时文件句柄被占用。解决确保编译已完成且无后台进程持有该文件。在MATLAB中使用!tasklist | findstr gccWindows或!lsof | grep your_file.oLinux/macOS检查。更可靠的做法是复制一份副本再解析copyfile(src.o, tmp_o_for_matlab.o)避免与构建系统冲突。5. 提取符号表与实战技巧让MATLAB真正“读懂”你的.o5.1 定位.symtab节并解析符号条目符号表.symtab是核心目标。其条目结构在ELF规范中定义64位下每个符号占24字节含st_name字符串索引、st_info绑定/类型、st_other、st_shndx所属节索引、st_value值、st_size大小。function symtab read_symtab(elf, sections, strtab) % 查找.symtab节 symtab_idx find(arrayfun((s) s.type 2, sections) ... arrayfun((n) strcmp(n, .symtab), section_names), 1); if isempty(symtab_idx) error(未找到.symtab节); end % 读取.symtab内容 fid fopen(elf.filename, r); fseek(fid, sections(symtab_idx).offset, bof); sym_data fread(fid, sections(symtab_idx).size, uint8); fclose(fid); % 计算符号数量64位ELF每个符号24字节 sym_entry_size 24; num_symbols floor(length(sym_data) / sym_entry_size); symtab struct(name, {}, value, {}, size, {}, bind, {}, type, {}, section_idx, {}); for i 1:num_symbols start (i-1)*sym_entry_size 1; % st_name: uint32 st_name typecast(sym_data(start:start3), uint32, elf.endian_suffix); % st_info: uint8高4位bind低4位type st_info sym_data(start4); bind bitshift(st_info, -4); type bitand(st_info, 15); % st_value: uint64 st_value typecast(sym_data(start8:start15), uint64, elf.endian_suffix); % st_size: uint64 st_size typecast(sym_data(start16:start23), uint64, elf.endian_suffix); % st_shndx: uint16 st_shndx typecast(sym_data(start24:start25), uint16, elf.endian_suffix); % 解析符号名用.strtab if st_name 0 st_name length(strtab) end_pos find(strtab(st_name:end) 0, 1, first); if ~isempty(end_pos) name char(strtab(st_name:st_nameend_pos-1)); else name sprintf(sym_%d, st_name); end else name unnamed; end % 存储 symtab(i).name name; symtab(i).value st_value; symtab(i).size st_size; symtab(i).bind bind; symtab(i).type type; symtab(i).section_idx st_shndx; end end技巧点st_info需拆解——bind1为STB_GLOBAL全局符号type2为STT_FUNC函数type1为STT_OBJECT变量。这些常量定义在elf.h中MATLAB中可预定义STB_GLOBAL 1; STB_LOCAL 0; STT_FUNC 2; STT_OBJECT 1;5.2 快速筛选你关心的符号函数、全局变量、未定义符号解析完symtab用逻辑索引秒筛% 获取所有全局函数 global_funcs symtab(arrayfun((s) s.bindSTB_GLOBAL s.typeSTT_FUNC, symtab)); % 获取所有全局变量非函数 global_vars symtab(arrayfun((s) s.bindSTB_GLOBAL s.typeSTT_OBJECT, symtab)); % 获取未定义符号st_shndx SHN_UNDEF 0 undefined_syms symtab(arrayfun((s) s.section_idx 0, symtab));实用价值在嵌入式开发中快速检查.o是否导出了预期API函数或验证链接时缺失的符号undefined_syms列表即undefined reference源头。5.3 验证解析正确性与objdump输出人工比对写个脚本导出MATLAB解析结果与objdump -t your_file.o对比% 导出为表格便于比对 T table({symtab.name}, [symtab.value], [symtab.size], ... arrayfun((s) [bind_ num2str(s.bind)], symtab, UniformOutput, false), ... arrayfun((s) [type_ num2str(s.type)], symtab, UniformOutput, false), ... VariableNames, {Name,Value,Size,Bind,Type}); writematrix(T, matlab_symtab.csv, Delimiter, ,);然后终端运行objdump -t your_file.o | awk {print $1,$2,$3,$4,$5,$6} objdump_symtab.txt用文本比较工具如diff核对关键符号的Value和Size。若一致证明你的MATLAB解析器可信。我的习惯是每次新增一个.o样本必跑一次objdump -h节头和objdump -t符号表作为黄金标准再调试MATLAB脚本。曾因忽略e_shentsize从Header读取硬编码64导致32位.o解析全错——那周的debug日志堆了2GB。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

算法竞赛题解复盘:树上差分与DSU on Tree优化实践

算法竞赛题解复盘:树上差分与DSU on Tree优化实践

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

2026/10/15 1:05:48 阅读更多 →
Qt开发者实战导航图:问题域驱动的知识体系重构

Qt开发者实战导航图:问题域驱动的知识体系重构

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

2026/10/15 1:04:47 阅读更多 →
DoIP协议详解:车载以太网诊断通信核心机制

DoIP协议详解:车载以太网诊断通信核心机制

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

2026/10/15 1:04:47 阅读更多 →

最新新闻

膜反应器原理、应用与维护全解析

膜反应器原理、应用与维护全解析

1. 膜反应器概述膜反应器作为一种将反应与分离过程耦合的装置,在化工、生物、环境等领域已有超过50年的应用历史。我第一次接触这类设备是在2012年参与某制药废水处理项目时,当时使用的中空纤维膜组件至今仍在稳定运行。这种将化学反应与膜分离技术相结合…

2026/10/15 8:57:11 阅读更多 →
驶向2030:拆解麦肯锡汽车竞速赛特刊的战略逻辑与行动指南

驶向2030:拆解麦肯锡汽车竞速赛特刊的战略逻辑与行动指南

简介:2023麦肯锡中国汽车行业CEO特刊《驶向2030——汽车行业竞速赛》是一份面向车企高管、战略规划者及汽车行业研究者的深度行业报告,聚焦智能电动汽车驱动下的市场重塑,剖析动力系统、核心胜负手与盈利模式三大变革。全刊围绕技术重塑、品牌…

2026/10/15 8:57:11 阅读更多 →
OpenCSG开源项目的本土化实践与技术自主创新

OpenCSG开源项目的本土化实践与技术自主创新

1. 开源模式的地域性适配思考第一次接触OpenCSG这个项目时,最让我惊讶的是它在GitHub上的中文文档占比。作为经历过十余个开源项目的老兵,我深知在全球化开源社区中保持母语技术文档需要多大的勇气和决心。这背后反映的正是中国开发者对技术自主权的深层…

2026/10/15 8:57:10 阅读更多 →
千亿级RAG知识库检索架构:腾讯云ES索引建模与性能调优实践

千亿级RAG知识库检索架构:腾讯云ES索引建模与性能调优实践

1. 千亿级知识库的检索困境:为什么传统方案撑不住做AI知识库的人,迟早会撞上一堵墙。这堵墙不是模型能力不够,而是检索层在数据量级和并发压力下开始崩塌。我最早接触RAG项目时,用的是单机Elasticsearch加几百GB的文档&#xff0c…

2026/10/15 8:57:10 阅读更多 →
ISO三大体系整合实战:条款对照与流程优化

ISO三大体系整合实战:条款对照与流程优化

1. 项目概述作为一名在质量管理体系领域摸爬滚打多年的从业者,我深知ISO三大体系标准在实际应用中的重要性。ISO9001(质量管理)、ISO14001(环境管理)和ISO45001(职业健康安全管理)这三个国际标准…

2026/10/15 8:57:10 阅读更多 →
基于Python的美妆化妆品销售商城平台的设计与实现

基于Python的美妆化妆品销售商城平台的设计与实现

选题背景与意义 随着互联网技术的迅猛发展和消费者购物习惯的深刻变革,电子商务已成为现代商业活动的重要组成部分。尤其在美妆化妆品领域,线上消费呈现出爆发式增长态势。根据中国互联网络信息中心(CNNIC)发布的《第52次中国互联…

2026/10/15 8:56:08 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →