如何计算 zip header 中“version by”的值?

How to compute the value for `version made by` in zip header?

我正在努力计算 adm-zipversion made by 正确值

Zip Spec is unclear in my opinion how to find the binary or int value to set an option (e.g. Option 3 Unix) to the depending 2 Bytes in the central header.

来自 adm-zip 的文档对 header 设置没有任何帮助。

来自 zip 规范 (4.4.2) 的映射:

4.4.2.2 The current mappings are:

0 - MS-DOS and OS/2 (FAT / VFAT / FAT32 file systems)
1 - Amiga                     2 - OpenVMS
3 - UNIX                      4 - VM/CMS

我找到了一种可能的解决方案,将 entry.header.made 属性 设置为 788

(entry.header as any).made = 788;

(此值只能通过导入由另一个 zip 实用程序创建的 zip 找到。)

谁能解释如何从所需的选项 3 开始计算此值 788

或者如何计算另一个选项的这个值,例如10 - Windows NTFS?

简短描述:

根据 specification,高位字节表示创建 ZIP 文件的 OS。低字节是使用的 ZIP 规范的版本。

在你的例子中:

788 = 0x0314

OS 创建了 ZIP 文件:
0x03(高字节):UNIX

4.4.2.1 The upper byte indicates the compatibility of the file attribute information. If the external file attributes are compatible with MS-DOS and can be read by PKZIP for DOS version 2.04g then this value will be zero. If these attributes are not compatible, then this value will identify the host system on which the attributes are compatible. Software can use this information to determine the line record format for text files etc.

ZIP规范版本:
0x14(低字节):版本 2.0

0x14 / 10 = 2(主要版本号)
0x14 % 10 = 0 (次版本号)

4.4.2.3 The lower byte indicates the ZIP specification version (the version of this document) supported by the software used to encode the file. The value/10 indicates the major version number, and the value mod 10 is the minor version number.

对于Windows NTFS,正确的“版本由”值应该是:

0x0A14 = 2580

0x0A(高字节):Windows NTFS (Win32)
0x14(低字节):版本 2.0

摘自adm-zip source

var _verMade = 0x14,
        _version = 0x0A,
        _flags = 0,
        _method = 0,
        _time = 0,
        _crc = 0,
        _compressedSize = 0,
        _size = 0,
        _fnameLen = 0,
        _extraLen = 0,

        _comLen = 0,
        _diskStart = 0,
        _inattr = 0,
        _attr = 0,
        _offset = 0;

    switch(process.platform){
        case 'win32':
            _verMade |= 0x0A00;
        case 'darwin':
            _verMade |= 0x1300;
        default:
            _verMade |= 0x0300;
    }

在这里您可以看到,使用了 ZIP 规范中的版本 2.0 (0x14) 并且有一个简单的 OR 左移 OS 创建了 ZIP 文件。

更新:
我写了一些简单的 JavaScript 示例函数,其中 returns verMade 的正确值以及 returns OS 的 [=24] 的主要和次要版本号=].

设置版本:

function zip_version_set(os, spec_major, spec_minor)
{
    var ret = (parseInt(spec_major, 10) * 10) + parseInt(spec_minor, 10);
    
    switch (os) {
    case "dos":
        ret |= 0x0000;
        break;
    case "win32":
        ret |= 0x0A00;
        break;
    case "darwin":
        ret |= 0x1300;
        break;
    default:
        ret |= 0x0300;
    }
    
    return ret;
}

用法:
参数 os:
给她输入 OS 字符串。当前可能的值为 dos (MS-DOS)、win32 (Windows NTFS)、darwin (OS X) 和默认值是 unix.

参数 spec_major:
将所用 ZIP 规范的 主要 版本号放在这里。

参数 spec_minor:
将所用 ZIP 规范中的 次要 版本号放在这里。

Return:
Returns verMade.

得到OS:

function zip_version_get_os(verMade)
{
    var tmp;
    var ret;
    
    tmp = (verMade & 0xFF00) >> 8;
    
    switch (tmp) {
    case 0x00:
        ret = "dos";
        break;
    case 0x03:
        ret = "unix";
        break;
    case 0x0A:
        ret = "win32";
        break;
    case 0x13:
        ret = "darwin";
        break;
    default:
        ret = "unimplemented";
    }
    
    return ret;
}

用法:
参数 verMade:
verMade 值放在这里。

Return:
Return将 OS 作为字符串。

获取主版本号(ZIP规范):

function zip_version_get_major(verMade)
{
    return ((verMade & 0xFF) / 10);
}

用法:
参数 verMade:
verMade 值放在这里。

Return:
Return是所用 ZIP 规范的主要版本。

获取次版本号(ZIP规范):

function zip_version_get_minor(verMade)
{
    return ((verMade & 0xFF) % 10);
}

用法:
参数 verMade:
verMade 值放在这里。

Return:
Returns 来自所用 ZIP 规范的次要版本。