SanketHajare44/File_Packer_Unpacker

GitHub: SanketHajare44/File_Packer_Unpacker

基于自定义二进制存档格式的全栈文件打包解包工具,支持浏览器端打包、解包与存档检查,并与原始 Java CLI 双向兼容。

Stars: 0 | Forks: 0

# 文件打包解包器 一个全栈 Web 应用程序,用于将文件打包成自定义的二进制存档并将其解包还原——通过自定义的 magic number (`SRH3`)、固定大小的单文件头以及基于 XOR 的编码进行验证。 最初是作为一个 Java CLI 工具 (`packer.java` / `unpacker.java`) 构建的,后来扩展为一个完整的 Web 应用程序,包含 Spring Boot REST API 和 React 前端,同时没有改变底层的存档布局——在浏览器中创建的存档与原始 CLI 工具完全兼容,反之亦然。 ## 截图 ### 打包 | 空状态 | 已排队文件 | |:---:|:---:| | ![打包面板,空](https://static.pigsec.cn/wp-content/uploads/repos/cas/0c/0cb90ccee7ec70c869913edb0dfa82d84986683723fb9736484c5dca9264a2d4.png) | ![打包面板,已排队文件](https://static.pigsec.cn/wp-content/uploads/repos/cas/3e/3eafc8ebd08785118abd1888e4eceb9bb63590fe8d1559510c162eefd58fc11f.png) | ### 解包 | 空状态 | 已检查存档 | |:---:|:---:| | ![解包面板,空](https://static.pigsec.cn/wp-content/uploads/repos/cas/03/038f22fca2b020e0d6f9a71f01c854f660531f9d4d20b1496a3bb4c4dec2a5a8.png) | ![解包面板,已检查存档](https://static.pigsec.cn/wp-content/uploads/repos/cas/2a/2aaa87176e762ef6ca465d69f25deea02f95f5d8b1a3c3fdc7da8291196fe27b.png) | ## 功能 - **打包** 直接从浏览器将任何文件夹或文件集合打包成单个 `.srh` 存档 - **解包** 将 `.srh` 存档解包还原为原始文件,并下载为 `.zip` - **实时文件头预览** — 在打包之前,查看将为任何选定文件写入的确切 100 字节文件头(以 hex + ASCII 转储的形式) - **存档检查** — 在解包之前,无需提取任何内容即可查看存档中包含的文件名和大小 - **格式安全验证** — 拒绝文件名无法存入存档固定 100 字节文件头的文件,并通过 magic number 和大小检查拒绝损坏的或非存档文件 - **CLI 兼容** — 原始的 Java CLI 工具仍然适用于 Web 应用生成的存档 ## 技术栈 | 层级 | 技术 | |---|---| | 后端 | Java 17, Spring Boot 3, Maven | | 前端 | React, Vite, Tailwind CSS | | 测试 | JUnit 5, Spring Boot Test | | 原始 CLI | Java (`packer.java`, `unpacker.java`) | ## 存档工作原理 每个打包的文件都以一个 4 字节的 **magic number**,即 `SRH3` 开头。这不是格式名称——它只是在存档开头写入的一个固定签名,以便解包程序在信任该文件之前对其进行验证。解包时,首先要检查的是这 4 个字节是否等于 `SRH3`;如果不是,则无论其名称为何或被重命名为什么,该文件都会立即被识别为无效而拒绝。 在 magic number 之后,每个打包的文件存储如下: ``` [100 bytes] header — " " padded with spaces [N bytes] file content, each byte XORed with key 0x11 ``` 此布局与原始 CLI 工具相比没有变化,这也是存档可以在 CLI 和 Web 应用程序之间双向互通的原因。 ## 项目结构 ``` File_Packer_Unpacker/ ├── backend/ Spring Boot REST API │ └── src/main/java/com/sanket/filepacker/ │ ├── controller/ REST endpoints (pack, unpack, inspect) │ ├── service/ PackerService, UnpackerService │ ├── dto/ ArchiveEntry, ExtractedFile │ ├── config/ CORS configuration │ └── exception/ Global error handling ├── frontend/ React + Tailwind UI │ └── src/ │ ├── components/ DropZone, FileTable, HexPreview, PackPanel, UnpackPanel │ └── utils/ Byte formatting, header hex-dump helpers ├── cli-reference/ Original packer.java / unpacker.java └── docs/assets/ Screenshots ``` ## 入门指南 ### 后端 需要 JDK 17+ 和 Maven。 ``` cd backend mvn spring-boot:run ``` 运行在 `http://localhost:8080`。健康检查:`GET /api/health`。 ### 前端 需要 Node 18+。 ``` cd frontend npm install cp .env.example .env npm run dev ``` 运行在 `http://localhost:5173`。 ### 测试 ``` cd backend mvn test ``` 涵盖 magic number、精确的文件头字节布局、XOR 编码、超大名称拒绝、多文件打包、完整的打包 → 解包往返过程,以及处理损坏/截断的存档。 ## API | 方法 | Endpoint | 描述 | |---|---|---| | `POST` | `/api/pack` | 将上传的文件打包成 `.srh` 存档 | | `POST` | `/api/inspect` | 不提取文件的情况下返回存档中的文件名/大小 | | `POST` | `/api/unpack` | 解包存档并返回包含内容的 `.zip` | | `GET` | `/api/health` | 健康检查 | ## 作者 **Sanket Sadashiv Hajare** [GitHub](https://github.com/SanketHajare44) · [LinkedIn](https://linkedin.com/in/sankethajare)
标签:React, Spring Boot, Syscalls, 文件打包解包, 自定义二进制格式, 自定义脚本