CTF多层编码拆解实战:从千层套路到自动化脚本

1. 从一道CTF题看多层编码的拆解思路

第一次看到"[MRCTF2020]千层套路1"这个题目名的时候,我脑子里第一反应就是——这肯定是个套娃题。CTF里带"千层"两个字的,十有八九是让你一层一层剥编码,剥到你手酸为止。事实证明我的直觉没错,这道题的核心玩法就是多层编码嵌套,你需要像剥洋葱一样,一层一层识别、解码,直到拿到最终的flag。

这篇文章适合谁看?如果你刚接触CTF的Misc方向,或者对编码转换还不太熟练,那这篇内容会帮你建立一套完整的"多层编码拆解"思维框架。如果你已经是有经验的老手,也可以看看我在拆解过程中总结的一些自动化脚本思路和踩坑经验,说不定能帮你省下不少时间。

先说结论:这道题本质上考察的不是什么高深的技术,而是你对常见编码特征的敏感度,以及把重复劳动自动化的能力。手工解个三五层还行,真给你来几十上百层,没有脚本你根本扛不住。所以这篇博文我会从编码识别、工具选型、脚本编写、常见坑点几个维度展开,把这道题彻底拆透。

2. 多层编码题的核心设计逻辑

2.1 为什么出题人喜欢搞"千层套路"

多层编码题在CTF的Misc方向里算是经典题型了,几乎每场比赛都会出现至少一道。出题人的逻辑很简单:单层编码太容易,Base64一眼就能看出来,ROT13稍微转一下也能认出来。但如果把多种编码交替嵌套,比如Base64套Hex再套Base32再套URL编码,一层一层叠上去,很多新手就会懵。

这种题目的考察点其实有三个层次。第一层是编码特征识别能力,你得看到一串字符就知道它大概率是什么编码。第二层是工具使用能力,知道用什么工具去解什么编码。第三层是自动化能力,当层数多到手工解不过来的时候,你得能写脚本批量处理。

"千层套路1"这个题目名本身就暗示了层数很多,而且"套路"两个字说明出题人可能在编码顺序或者编码方式上设置了陷阱,不是简单的循环套同一种编码。

2.2 常见编码类型及其特征速查

在动手解题之前,我先整理一份常见编码的特征对照表,这个表在实战中非常有用,建议收藏:

编码类型典型特征识别要点
Base64大小写字母+数字,末尾可能有=字符集为A-Za-z0-9+/,长度通常是4的倍数
Base32大写字母+数字2-7,末尾可能有=字符集为A-Z2-7,长度通常是8的倍数
Hex只有0-9和a-f长度为偶数,两个字符代表一个字节
URL编码大量%XX形式%后跟两个十六进制数字
ROT13字母偏移13位看起来像正常英文但读不通
二进制只有0和1长度通常是8的倍数
Unicode\uXXXX形式反斜杠u开头
ASCII码纯数字,空格分隔数字范围在32-126之间

这张表是我自己在做题过程中慢慢总结出来的,刚开始的时候我经常把Base32和Base64搞混,后来发现最简单的区分方法就是看字符集——Base32只有大写字母和2-7的数字,不会出现小写字母,这个特征非常明显。

提示:实际比赛中,出题人可能会对编码结果做二次处理,比如在Base64字符串中插入换行符或者空格,这时候你需要先清理掉这些干扰字符再解码。

2.3 解题思路的整体框架

拿到一道多层编码题,我的标准流程是这样的:

  1. 观察原始字符串:看字符集、长度、是否有明显的编码特征
  2. 尝试第一层解码:根据特征选择对应的解码方式
  3. 观察解码结果:判断结果是什么类型的数据,是否还是编码
  4. 循环处理:重复步骤2-3,直到结果看起来像flag或者明文
  5. 验证结果:检查是否符合flag格式(通常是flag{...}的形式)

这个流程看起来简单,但实际操作中最大的问题就是——你不知道一共有多少层,也不知道下一层是什么编码。所以最稳妥的方式是写一个自动化脚本,让脚本去循环尝试各种解码方式,直到出现可读文本。

3. 手工拆解与自动化脚本的取舍

3.1 手工拆解适合什么场景

如果你的题目只有三五层编码,手工拆解完全没问题,而且更直观。手工拆解的好处是每一步你都能看到中间结果,如果某一层解错了,你能立刻发现并调整方向。

手工拆解我一般用这几个工具:

  • CyberChef:浏览器里就能用,支持几乎所有常见编码的互相转换,还能拖拽组合操作,非常适合快速试错
  • Python命令行:临时写几行代码验证一下,比如base64.b64decode()、bytes.fromhex()之类的
  • 在线编码转换工具:适合快速验证单个编码,但不适合处理敏感数据

CyberChef是我最推荐的工具,它的"Magic"功能可以自动检测编码类型并尝试解码,对于不确定编码类型的情况特别有用。但要注意,Magic功能有时候会误判,尤其是面对多层嵌套的时候,它可能解到一半就卡住了。

3.2 什么时候必须上脚本

当层数超过十层,或者你发现解码模式是循环重复的,那就必须写脚本了。手工解几十层不仅效率低,而且容易出错——你可能解到第二十层的时候忘记前面用了什么编码,导致方向跑偏。

写脚本的核心思路是:循环尝试所有可能的解码方式,每次成功解码后检查结果是否还是编码,如果是就继续解,如果不是就输出结果。

下面是我常用的一个Python脚本框架,可以自动循环解码多层编码:

import base64 import binascii import urllib.parse import re def try_decode(data): """尝试各种解码方式,返回所有可能的解码结果""" results = [] # 尝试Base64解码 try: decoded = base64.b64decode(data).decode('utf-8') results.append(('base64', decoded)) except: pass # 尝试Base32解码 try: decoded = base64.b32decode(data).decode('utf-8') results.append(('base32', decoded)) except: pass # 尝试Hex解码 try: decoded = bytes.fromhex(data).decode('utf-8') results.append(('hex', decoded)) except: pass # 尝试URL解码 try: decoded = urllib.parse.unquote(data) if decoded != data: results.append(('url', decoded)) except: pass # 尝试ROT13 try: import codecs decoded = codecs.decode(data, 'rot_13') if decoded != data: results.append(('rot13', decoded)) except: pass return results def auto_decode(data, max_layers=100): """自动循环解码""" current = data.strip() for i in range(max_layers): results = try_decode(current) if not results: print(f"[第{i+1}层] 无法继续解码,最终结果:") print(current) return current # 优先选择看起来像编码的结果继续 # 这里可以根据实际情况调整优先级 for method, decoded in results: print(f"[第{i+1}层] 使用{method}解码:{decoded[:50]}...") current = decoded.strip() break return current # 使用示例 encoded_data = "你的编码字符串放在这里" auto_decode(encoded_data)

这个脚本的核心逻辑是:每次尝试所有可能的解码方式,只要有一种成功就继续往下解。但这里有个问题——如果多种解码方式都能成功,你该选哪个?我的经验是,优先选择解码结果看起来"更像编码"的那个,比如解码后还是纯字母数字组合,那大概率还需要继续解。

3.3 脚本优化:加入编码类型判断

上面的脚本有个缺陷,就是它不知道当前字符串到底是什么编码,只能盲目尝试。更聪明的做法是先判断编码类型,再选择对应的解码方式。下面是一个编码类型判断函数:

def detect_encoding(data): """判断字符串最可能是什么编码""" data = data.strip() # 纯二进制 if re.match(r'^[01]+$', data) and len(data) % 8 == 0: return 'binary' # 纯十六进制 if re.match(r'^[0-9a-fA-F]+$', data) and len(data) % 2 == 0: return 'hex' # Base64特征 if re.match(r'^[A-Za-z0-9+/]+=*$', data) and len(data) % 4 == 0: return 'base64' # Base32特征 if re.match(r'^[A-Z2-7]+=*$', data) and len(data) % 8 == 0: return 'base32' # URL编码特征 if '%' in data and re.search(r'%[0-9a-fA-F]{2}', data): return 'url' # Unicode特征 if '\\u' in data: return 'unicode' return 'unknown'

有了这个判断函数,脚本就可以先识别编码类型,再精准解码,效率会高很多。不过要注意,这个判断函数也不是万能的,有些编码的字符集有重叠,比如Base64和Base32在某些情况下可能混淆,这时候就需要结合长度和其他特征综合判断。

4. 完整解题流程与关键步骤实录

4.1 初始字符串分析

假设我们拿到的原始字符串是这样的(实际题目中可能更长):

4A5A5A5A5A5A5A5A...

第一步是观察。这串字符只有数字和大写字母A-F,长度是偶数,这明显是十六进制编码的特征。但别急着下结论,先看看有没有其他可能性——比如它会不会是Base64?Base64的字符集包含小写字母,而这串字符只有大写字母和数字,所以排除Base64。Base32的字符集是A-Z和2-7,这串字符里出现了0和1,所以也排除Base32。

结论:这是Hex编码,直接解。

4.2 逐层解码过程

Hex解码之后,我们得到了一串新的字符串。这时候要再次观察——它是什么类型?

假设解码后得到的是类似这样的内容:

ZmxhZ3t...

这明显是Base64的特征:大小写字母混合,末尾可能有等号。继续解Base64。

Base64解码后,可能得到的是:

flag{...}

如果运气好,到这里就结束了。但"千层套路"不会这么简单,更可能的情况是解码后得到的是另一种编码,比如URL编码、ROT13、或者又是Hex。

我实际拆解这类题目的时候,遇到过最夸张的情况是:Hex → Base64 → Base32 → Hex → URL → Base64 → ... 循环了二十多层才出来。这种时候手工解真的会疯,必须上脚本。

4.3 自动化脚本实战

针对"千层套路"这类题目,我写了一个增强版的自动解码脚本,核心改进是加入了编码类型自动识别和解码结果验证:

import base64 import binascii import urllib.parse import codecs import re def detect_and_decode(data): """自动识别编码类型并解码""" data = data.strip() # 二进制 if re.match(r'^[01]+$', data) and len(data) % 8 == 0: try: decoded = ''.join(chr(int(data[i:i+8], 2)) for i in range(0, len(data), 8)) return 'binary', decoded except: pass # Hex if re.match(r'^[0-9a-fA-F]+$', data) and len(data) % 2 == 0: try: decoded = bytes.fromhex(data).decode('utf-8') return 'hex', decoded except: pass # Base64 if re.match(r'^[A-Za-z0-9+/]+=*$', data) and len(data) % 4 == 0: try: decoded = base64.b64decode(data).decode('utf-8') return 'base64', decoded except: pass # Base32 if re.match(r'^[A-Z2-7]+=*$', data) and len(data) % 8 == 0: try: decoded = base64.b32decode(data).decode('utf-8') return 'base32', decoded except: pass # URL编码 if '%' in data: try: decoded = urllib.parse.unquote(data) if decoded != data: return 'url', decoded except: pass # ROT13 try: decoded = codecs.decode(data, 'rot_13') if decoded != data and re.match(r'^[\x20-\x7e]+$', decoded): return 'rot13', decoded except: pass return None, data def solve(data, max_iter=200): """主解题循环""" current = data.strip() for i in range(max_iter): # 检查是否已经拿到flag if 'flag{' in current.lower(): print(f"\n[成功] 在第{i}层找到flag:") print(current) return current method, decoded = detect_and_decode(current) if method is None: print(f"\n[停止] 第{i}层无法继续解码") print(f"当前内容:{current[:200]}") return current print(f"[第{i+1}层] {method}解码 -> {decoded[:60]}...") current = decoded print("\n[警告] 达到最大迭代次数,可能陷入循环") return current # 使用 encoded = "你的初始编码字符串" solve(encoded)

这个脚本的关键改进点在于:

  1. 优先级判断:先判断是不是二进制、Hex、Base64、Base32,这些编码的特征比较明显,不容易误判
  2. 异常处理:每种解码都包在try-except里,解码失败就跳过,不会中断整个流程
  3. flag检测:每层解码后都检查是否包含"flag{",一旦发现就立即输出
  4. 迭代上限:设置最大迭代次数,防止陷入死循环

4.4 实操中的关键细节

在实际运行脚本的过程中,有几个细节需要特别注意:

第一,字符串清理。原始字符串中可能包含换行符、空格、制表符等不可见字符,这些字符会干扰解码。所以在每次解码前,一定要先strip()清理一下。我遇到过好几次因为末尾多了个换行符导致Base64解码失败的情况,排查了半天才发现是这个问题。

第二,编码判断的优先级。有些字符串可能同时符合多种编码的特征,比如一个纯数字的字符串既可能是Hex也可能是十进制ASCII码。这时候需要根据上下文来判断——如果前面的解码结果是Base64,那这一层大概率还是Base64或者Hex,不太可能突然变成二进制。

第三,解码结果的编码问题。Python的decode()方法默认使用UTF-8,但有些编码解码后的结果可能不是合法的UTF-8字符串,这时候会抛出UnicodeDecodeError。解决办法是先用errors='ignore'忽略非法字符,或者尝试其他编码方式如latin-1。

注意:如果脚本跑了几十层还没出结果,有可能是遇到了循环编码(比如Base64编码后再Base64解码得到原串),这时候需要检查是否陷入了死循环。可以在脚本中加入历史记录,如果当前字符串之前出现过,就说明循环了。

5. 常见问题与排查技巧实录

5.1 解码失败怎么办

这是最常见的问题。你明明觉得应该是Base64,但解码就是报错。可能的原因有:

  • 字符串不完整:复制的时候漏掉了末尾的等号或者部分字符
  • 包含非法字符:字符串中混入了空格、换行符等
  • 编码判断错误:它可能不是Base64,而是Base32或者其他编码
  • 需要先做其他处理:比如先反转字符串、先做ROT13再解码

排查方法:先用len()看一下长度是否符合编码的长度要求(Base64是4的倍数,Base32是8的倍数),然后用正则表达式检查字符集是否匹配。

5.2 解到一半出现乱码

这种情况通常是因为解码方式选错了。比如你把一个Hex字符串当成了Base64来解,虽然可能不报错,但解出来的结果是乱码。

判断方法:如果解码结果中出现了大量不可打印字符(比如\x00、\xff之类的),那基本可以确定解码方式错了。正确的解码结果应该是可读的ASCII字符或者另一种编码的字符串。

5.3 如何判断是否已经解到最后一层

最后一层的特征通常是:

  • 包含flag{或者FLAG{等关键词
  • 是一段可读的英文文本
  • 符合题目要求的格式

如果解出来的东西看起来还是像编码(比如还是纯字母数字组合),那就继续解。如果解出来是一段有意义的中文或者英文,那大概率就是最终结果了。

5.4 常见问题速查表

问题现象可能原因解决方法
Base64解码报错字符串长度不是4的倍数检查是否漏字符,补全等号
解码结果是乱码编码类型判断错误尝试其他解码方式
脚本陷入死循环遇到循环编码加入历史记录检测
解了50层还没结果可能漏了某层或方向错了回退检查每层结果
Hex解码报错字符串包含非十六进制字符清理非法字符
结果看起来像flag但不完整可能还有一层编码继续解码

5.5 独家避坑经验

说几个我自己踩过的坑,希望能帮你省点时间:

坑一:不要迷信在线工具。很多在线编码转换工具对多层编码的支持不好,而且有些工具会自动帮你做额外的处理(比如自动添加换行),导致结果和预期不一致。建议还是用Python脚本,可控性最强。

坑二:注意编码的大小写。Base32编码的结果是大写字母,但有些题目会把它转成小写,这时候你需要先转回大写再解码。Base64是区分大小写的,不能随意转换。

坑三:别忘了反转和移位。有些题目会在编码之间插入反转字符串、凯撒移位等操作,不是纯粹的编码嵌套。如果发现解码结果不对劲,试试先反转一下再解。

坑四:flag格式要确认。不同比赛的flag格式可能不同,有的用flag{},有的用CTF{},有的用mrctf{}。脚本里的检测关键词要根据实际情况调整。

坑五:保存中间结果。解多层编码的时候,建议把每一层的结果都打印出来或者保存到文件里。万一后面解错了,可以快速回退到某一层重新尝试,不用从头再来。

6. 工具选型与效率提升建议

6.1 CyberChef的进阶用法

CyberChef是我最推荐的在线工具,它的"Recipe"功能可以把多个操作串联起来,形成一个处理流水线。比如你可以创建一个Recipe:From Hex → From Base64 → From Base32 → From Hex → ...,然后一次性跑完所有层。

但CyberChef的局限性在于,它需要你提前知道每一层是什么编码。如果编码顺序不确定,还是得靠脚本来自动判断。

6.2 Python脚本的模块化设计

如果你经常做这类多层编码题,建议把解码脚本模块化,做成一个可以复用的工具。我的做法是:

  • 把编码识别、解码、验证分别写成独立的函数
  • 主流程只负责循环调用这些函数
  • 加入日志输出,方便追踪每一层的处理结果
  • 支持从文件读取输入,结果输出到文件

这样下次遇到类似的题目,直接改一下输入就能用,不用重新写代码。

6.3 性能优化:什么时候该放弃自动判断

自动判断编码类型虽然方便,但并不是万能的。当编码层数很多,而且编码类型频繁切换的时候,自动判断可能会出错。这时候更稳妥的做法是:先手工解前几层,摸清楚编码的规律(比如是不是按Hex→Base64→Base32的顺序循环),然后针对这个规律写专门的脚本。

举个例子,如果你发现编码顺序是固定的Hex→Base64→Base32循环,那脚本就可以直接按这个顺序解,不用每次都去判断编码类型,效率会高很多,而且不会误判。

7. 从这道题延伸出的实战思维

"千层套路1"这类题目表面上考的是编码转换,实际上考的是模式识别和自动化思维。在实际的安全工作中,你经常会遇到类似的情况——大量的重复性分析工作,手工做效率极低,必须想办法自动化。

我在处理这类题目时最大的体会是:不要急着动手解,先花两分钟观察规律。看看字符串的长度变化、字符集变化,判断出编码的大致顺序,然后再决定是手工解还是写脚本。盲目动手往往会在某一层卡住,然后浪费大量时间。

另外,这类题目也提醒我,基础知识的熟练度决定了你的解题速度。如果你对每种编码的特征都烂熟于心,看到字符串就能条件反射地判断出编码类型,那解题速度会快很多。反之,如果你每次都要去查资料确认编码特征,那效率就会大打折扣。

最后分享一个我个人的习惯:每次做完一道多层编码题,我都会把解题过程记录下来,包括用了什么编码、顺序是什么、遇到了什么问题、怎么解决的。这些记录在下次遇到类似题目的时候非常有用,因为出题人的套路往往有相似之处。积累多了之后,你甚至能一眼看出某些题目的出题风格,直接猜到编码顺序。

这个内容后续还可以这样扩展:把脚本改造成支持更多编码类型(比如Base85、Base58、UUencode等),或者加入GUI界面方便操作。如果你对逆向感兴趣,也可以研究一下出题人是怎么生成这些多层编码的,写一个编码生成器来练手,反向加深对编码的理解。

相关新闻

深度学习图像合成技术全解析:从抠图到光照协调的实战指南

深度学习图像合成技术全解析:从抠图到光照协调的实战指南

1. 为什么图像合成值得一篇独立的综述图像合成,英文叫 image composition,也有人叫 image blending、image merging,国内社区里更常见的说法是“融图”或者“溶图”。它干的事情说起来特别朴素:把一张图里的某个前景物体抠出来&am…

2026/10/20 20:22:55 阅读更多 →
钢价上涨竟成仓储自动化推手?一文看懂TCO与单位库位成本逻辑

钢价上涨竟成仓储自动化推手?一文看懂TCO与单位库位成本逻辑

钢铁涨价的消息一出,很多仓储从业者的第一反应是皱眉:货架要贵了,项目预算要超了,利润又要被吃掉一块。但最近跟几个做仓储集成的同行聊下来,发现一个有点反直觉的现象——钢材越涨,仓储自动化项目反而越顺…

2026/10/20 20:21:53 阅读更多 →
大模型选型指南:API调用、私有化平台与行业方案怎么选

大模型选型指南:API调用、私有化平台与行业方案怎么选

1. 从一次选型评审说起:为什么都在选,却容易选错前阵子我陪某制造业客户做了一轮大模型供应商评审,前后见了三家企业,每家的方案讲解都很精彩,产品演示也都跑得通,但讲完以后,客户团队里出现了两…

2026/10/20 20:21:53 阅读更多 →

最新新闻

TensorFlow鞋类识别实战:Fashion MNIST图像分类全流程

TensorFlow鞋类识别实战:Fashion MNIST图像分类全流程

前段时间重新整理之前的深度学习实验笔记,翻到鞋类识别(Fashion MNIST)这个项目时,觉得特别值得拿出来单独写一篇。原因很简单:很多人入门深度学习时,都会被建议先跑通手写数字识别(MNIST&#…

2026/10/20 20:57:37 阅读更多 →
用AI辅助Kamailio路由排错:一场人机讨论实录与故障切换实践

用AI辅助Kamailio路由排错:一场人机讨论实录与故障切换实践

最近接手一套老的SIP通信平台,核心信令是Kamailio撑着。业务要新增一个较复杂的路由策略:同一个主叫号码,在不同时间段、针对不同被叫前缀,要分别走不同的网关;而其中一路网关做故障切换时,还要保证已经建立…

2026/10/20 20:57:37 阅读更多 →
LibVLC轻量级视频播放模块:嵌入C/C++工程的硬件解码方案

LibVLC轻量级视频播放模块:嵌入C/C++工程的硬件解码方案

简介:本资源是一份基于C/C与VLC开源库开发Windows视频播放器的完整工程实践包,面向具备基础C编程能力、希望掌握多媒体开发技能的中级开发者及高校课程设计学习者。资源聚焦于在Visual Studio 2022环境下集成libvlc实现视频加载、播放控制、窗口渲染等核…

2026/10/20 20:57:37 阅读更多 →
AI Agent创业团队如何配置一支高效的Harness Engineering团队

AI Agent创业团队如何配置一支高效的Harness Engineering团队

1. 为什么需要一支专门的Harness Engineering团队先从一个很现实的场景说起:你所在的创业团队花三个月做出了一个基于大模型的Agent产品Demo,演示给投资人看时效果炸裂,但真正进入客户试用阶段,问题接踵而来——模型给出正确意图却…

2026/10/20 20:57:37 阅读更多 →
视觉语言模型与RGB-D感知融合:三条进化主线与工程实践

视觉语言模型与RGB-D感知融合:三条进化主线与工程实践

1. 从 Transformer 到多模态感知的演进逻辑视觉语言模型和 RGB-D 感知这两个方向,过去几年基本是各走各的路。做 VLM 的人盯着图文对齐、指令跟随、视觉问答这些任务,做 RGB-D 的人则埋头于点云配准、深度补全、SLAM 建图。但最近一年,这两条…

2026/10/20 20:57:37 阅读更多 →
VTI介质地震波数值模拟:MATLAB实现与各向异性正演避坑指南

VTI介质地震波数值模拟:MATLAB实现与各向异性正演避坑指南

简介:这份资源面向地震勘探与地球物理方向的学习者和研究者,提供一套基于Matlab的VTI介质地震波场数值模拟程序,用于分析各向异性介质中地震波的传播规律。VTI介质在垂直与平行层理方向上纵波速度存在差异,是实际地壳中常见的各向…

2026/10/20 20:56:32 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →