我将如何创建自己的 zip 文件?

How would I create my own zip like file?

我希望能够创建一个类似于 zip 但同时又不是真正的 zip 的文件。

假设我有一个程序,它将获取一堆文件和目录并将它们存储到一个名称和扩展名为 data.rds 的文件中,您将需要相同的程序来提取它们它的。我在很多不同的游戏中看到他们使用 .arc.nsa.mxdl 等文件格式,它们都在其中存储了许多文件,.rar 可能是最常见的格式。这四个扩展不能作为普通 zip 打开,需要特定的程序才能从中提取文件,我想了解如何将多个文件加密和解密为一个文件而不使其像它一样可读将在一个普通的 zip 文件中。

人们会怎么做呢?我知道这将是一个漫长的过程,不会用几行简单的代码来回答,但如果有人能指出我学习如何做这样的事情的方向,那将很有帮助。

你可以这样处理:

1) 从一个 "simply" 将目录内容、文件列表...存储在单个文件中的应用程序开始。含义:学习如何收集所有这些文件;以及如何将它们推送到一个未压缩的存档中(当然:确保之后可以再次提取内容)

2) 当该步骤有效时(并经过适当和广泛的测试);然后添加一个 "compression" 响应。 "decompression"步。

您最喜欢的搜索引擎在搜索 "compression algorithms" 时会给您很多结果。

这取决于你的目标。

我假设您希望编写自己的算法来取乐。

如果你只是想打包并加密它们,好吧,只需要你需要的文件并按顺序写入它们的二进制内容,在文件的开头加上索引之类的东西table,它会告诉您每个文件在大文件中的起始位置。然后使用您选择的算法加密所有内容。

如果您还想压缩它们,我认为建议您实施的最简单算法是二进制内容的霍夫曼编码。请注意,虽然理论上很简单,但实施起来仍然很困难,因此请仔细考虑是否值得,或者您是否可以依赖现成的东西。

底线:如果你这样做是为了自学一些东西,那就去做吧。如果你在一个更大的项目中需要它,而最终目标不是学习这些东西,那就拿一些已经存在的东西。

我感觉你更关心真实性,即存档没有被修改。我将进一步假设您真的不想实现自己的压缩算法。

话虽如此,您可以做的是:

  1. 创建一个具有不同扩展名的 zip。
  2. 计算文件的 SHA1 哈希值
  3. 使用 SHA1 哈希检查该存档是否未被更改。

无论你发明什么格式,总会有人想出来的。任何人都可以反编译您的代码并查看您的算法。

我只想使用 Zip 格式并给文件一个不同的扩展名(听起来您已经这样做了)。防止不经意的观察者打开您的文件的一个简单方法是在文件的前面放置几个垃圾字节:

private static final byte[] secretSignature = { 10, 20 };

void writeData(Path file)
throws IOException {
    try (OutputStream out = new BufferedOutputStream(
            Files.newOutputStream(file))) {
        out.write(secretSignature);

        ZipOutputStream zip = new ZipOutputStream(out);
        // Write zip entries
        zip.finish();
    }
}

void readData(Path file)
throws IOException {
    try (InputStream in = new BufferedInputStream(
            Files.newInputStream(file))) {
        in.skip(secretSignature.length);

        ZipInputStream zip = new ZipInputStream(in);
        ZipEntry entry;
        while ((entry = zip.getNextEntry()) != null) {
            // Read entry
        }
    }
}