使用C#查找MPEG文件的I帧宏块数据并进行XOR处理
没问题,我来帮你搞定这个MPEG文件I帧宏块的XOR处理需求,用FileStream来实现文件读写的完整方案如下:
实现思路
- 用
FileStream读取原始MPEG文件的全部字节数据,同时创建目标文件的FileStream用于写入结果 - 解析MPEG文件的帧结构,定位I帧(MPEG标准中I帧的起始码为
0x00 0x00 0x01 0x00) - 对I帧范围内的宏块字节数据执行XOR异或修改(可自定义异或密钥)
- 将修改后的字节数据写入新文件,确保资源正确释放
完整代码实现
private void button4_Click(object sender, EventArgs e) { // 定义XOR密钥,可根据需求修改 byte xorKey = 0xAA; string sourcePath = textBox1.Text; string targetPath = textBox2.Text; // 使用using语句自动管理FileStream资源,避免内存泄漏 using (FileStream fsRead = new FileStream(sourcePath, FileMode.Open, FileAccess.Read)) using (FileStream fsWrite = new FileStream(targetPath, FileMode.Create, FileAccess.Write)) { long fileSize = fsRead.Length; byte[] fileBytes = new byte[fileSize]; // 读取整个文件到字节数组 fsRead.Read(fileBytes, 0, (int)fileSize); Console.WriteLine("开始处理文件..."); // 遍历字节数组,寻找I帧起始码并处理 for (int i = 0; i < fileSize - 3; i++) { // 检测MPEG I帧起始码:0x00 0x00 0x01 0x00 if (fileBytes[i] == 0x00 && fileBytes[i+1] == 0x00 && fileBytes[i+2] == 0x01 && fileBytes[i+3] == 0x00) { Console.WriteLine($"找到I帧,起始位置:{i}"); // 从I帧起始码后第4个字节开始处理,直到下一个帧起始码 int currentPos = i + 4; while (currentPos < fileSize - 3) { // 检测是否到达下一个帧的起始码(所有MPEG帧起始码都是0x000001xx) if (fileBytes[currentPos] == 0x00 && fileBytes[currentPos+1] == 0x00 && fileBytes[currentPos+2] == 0x01) { break; } // 对当前字节执行XOR操作 fileBytes[currentPos] ^= xorKey; currentPos++; } // 跳过已处理的I帧范围,避免重复检测 i = currentPos - 1; } } // 将修改后的字节数组写入目标文件 fsWrite.Write(fileBytes, 0, fileBytes.Length); Console.WriteLine("文件处理完成!"); } }
关键细节说明
- 资源管理:使用
using语句包裹FileStream,确保文件流在使用后自动关闭和释放资源,避免文件占用问题 - I帧检测逻辑:MPEG的帧起始码格式为
0x00 0x00 0x01 xx,其中xx=0x00对应I帧,这个是标准的MPEG-1/2帧起始标识 - XOR处理范围:从I帧起始码结束的位置开始,直到下一个帧起始码前的所有字节都视为I帧的宏块数据,执行异或操作
- 读写效率:小文件采用一次性读取整个文件到字节数组的方式更高效;如果是超大文件,建议分块读取处理,避免内存占用过高
内容的提问来源于stack exchange,提问作者Edward
相关产品推荐
相关产品推荐

