讲师中心 微信公众号
AI工具推荐 视频效率加速

c++怎么实现文件内容的简单位移加密_自定义流缓冲区过滤【进阶】

千静君_8135

千静君_8135

发布时间:2026-03-23 20:24:01

|

525人浏览过

|

来源于php中文网

原创

需继承std::streambuf并重写underflow()(读)和sputn()(写),对a-z/A-Z循环位移、其余字符透传,顺序读写最稳妥,替换rdbuf()后不可依赖seekg()或gcount()。

c++怎么实现文件内容的简单位移加密_自定义流缓冲区过滤【进阶】

怎么用 std::streambuf 拦截并修改文件读写内容

核心是继承 std::streambuf,重写 underflow()(读)和 sputn()/overflow()(写),把字节流在进入 std::istream 或 std::ostream 前做位移变换。不是包装 std::ifstream,而是替换它的底层缓冲区。

  • underflow() 被调用时,从原始文件读一批字节 → 逐字节加偏移(如 +3)→ 存入内部缓冲区 → 返回首字节指针
  • sputn() 更适合写:拿到用户要写的原始数据指针和长度,先位移处理再转发给底层 filebuf
  • 别重写 sync() 除非你要强制刷盘逻辑;默认委托给基类即可
  • 注意:std::streambuf 不管理内存生命周期,你得自己 new[]/delete[] 缓冲区,或用 std::vector<char></char> 管理

位移加密必须处理的边界:非字母字符和模运算

直接对所有字节 +3 会破坏二进制文件(比如 PNG 头变成乱码),也容易让可打印 ASCII 超出范围。实际中几乎没人对整个文件字节做无差别位移——那不是加密,是损坏。

  • 只对 a-z、A-Z 做循环位移('z' + 1 → 'a'),其他字符原样透传
  • 用 (c - 'a' + shift) % 26 + 'a' 这类表达式,别写 c + shift 然后靠 char 溢出自动绕回——有符号 char 溢出是未定义行为
  • 如果目标是“简单位移”,就别碰 UTF-8 多字节序列;遇到 0x80–0xFF 字节一律跳过,否则中文文件一读就崩

为什么不能直接用 fstream 的 rdbuf() 替换后还调 seekg

替换了 rdbuf() 后,seekg() 行为不可靠:你的自定义 streambuf 没实现 seekoff() 和 seekpos(),标准库会退回到失败路径,导致位置错乱或读取重复/跳字。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 要么完全放弃随机访问,只做顺序读写(最常见、最稳)
  • 要么必须重写 seekoff():把逻辑映射回原始文件偏移(比如你缓存了 1024 字节,当前逻辑位置是 500,那原始位置就是 base_offset + 500)
  • 别依赖 gcount() 返回值——它返回的是从你的缓冲区“吐出”的字节数,不是原始文件读了多少
  • 调试时打印 in.gcount() 和 in.tellg() 对比,很容易发现位置漂移

std::iostream 绑定自定义 streambuf 的三步实操

不是构造时传参,而是先构造空流,再用 rdbuf() 替换,最后关联文件。漏掉任何一步都会静默失败。

立即学习“C++免费学习笔记(深入)”;

  • 声明一个继承 std::streambuf 的类 ShiftBuf,在构造函数里打开原始 std::filebuf 并保存指针
  • 创建 std::istream in(nullptr)(C++11 起允许空初始化),再调 in.rdbuf(new ShiftBuf("data.txt"))
  • 写入同理:std::ostream out(nullptr); out.rdbuf(new ShiftBuf("out.txt", std::ios::out))
  • 注意:ShiftBuf 析构时必须显式关闭内部 filebuf,否则文件句柄泄漏
  • 示例关键行:in >> word; 此时 underflow() 自动触发,你已经在里面做了位移

位移本身很简单,难的是让 streambuf 在各种 std::ios 标志(skipws、hex)、异常模式、缓冲区大小变化下不崩——这些细节没文档,全靠看 libstdc++/libc++ 源码里的注释和测试用例。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

359

2026.04.23

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

2911

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

885

2023.12.29

overflow什么意思
overflow什么意思

overflow是一个用于控制元素溢出内容的属性,当元素的内容超出其指定的尺寸时,overflow属性可以决定如何处理这些溢出的内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3180

2024.08.15

常见的编码方式
常见的编码方式

常见的编码方式有ASCII编码、Unicode编码、UTF-8编码、UTF-16编码、GBK编码等。想了解更多编码方式相关内容,可以阅读本专题下面的文章。

1448

2023.10.24

a和A对应的ASCII码数值
a和A对应的ASCII码数值

a的ascii码是65,a的ascii码是97;ascii码表中,一个字母的大小写数值相差32,一般知道大写字母的ascii码数值,其对应的小写字母的ascii码数值就算出来了,是大写字母的ascii码数值“+32”。想了解更多相关的内容,可阅读本专题下面的相关文章。

5207

2024.10.24

word背景色怎么改成白色
word背景色怎么改成白色

Word是微软公司的一个文字处理器软件。word为用户提供了专业而优雅的文档工具,帮助用户节省时间并得到优雅美观的结果。word提供了许多易于使用的文档创建工具,同时也提供了丰富的功能供创建复杂的文档使用。怎么word背景色怎么该呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

4451

2023.07.21

word最后一页空白页怎么删除
word最后一页空白页怎么删除

word最后一页空白页删除方法有:通过删除回车符、调整页边距、删除分节符或调整分页符位置,您可以轻松去除最后一页的空白页。根据您实际的文档情况,选择适合您的方法进行操作,使您的文档更加美观和整洁。本专题为大家提供word最后一页空白页怎么删除不了相关的各种文章、以及下载和课程。

1000

2023.07.24

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

0

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn