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 工具完全兼容,反之亦然。
## 截图
### 打包
| 空状态 | 已排队文件 |
|:---:|:---:|
|  |  |
### 解包
| 空状态 | 已检查存档 |
|:---:|:---:|
|  |  |
## 功能
- **打包** 直接从浏览器将任何文件夹或文件集合打包成单个 `.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, 文件打包解包, 自定义二进制格式, 自定义脚本