2

我正在努力计算in adm -zip的正确值version made by

在我看来,Zip Spec不清楚如何找到二进制或 int 值以将选项(例如)设置为中央标头Option 3 Unix中依赖的 2 字节。

来自 adm-zip 的用于标头设置的文档根本没有帮助。

从 zip 规范 (4.4.2) 映射:

4.4.2.2 目前的映射是:

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 util 创建的 zip 才能找到此值。)

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

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

4

1 回答 1

2

简短的介绍:

根据规范,高字节代表创建 ZIP 文件的操作系统。低字节是使用的 ZIP 规范的版本。

在您的示例中:

788 =0x0314

创建 ZIP 文件的操作系统:(
0x03高字节):UNIX

4.4.2.1 高字节表示文件属性信息的兼容性。如果外部文件属性与 MS-DOS 兼容并且可以通过 PKZIP for DOS 版本 2.04g 读取,则该值将为零。如果这些属性不兼容,则此值将标识属性兼容的主机系统。软件可以使用此信息来确定文本文件等的行记录格式。

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

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

4.4.2.3 低字节表示用于对文件进行编码的软件所支持的 ZIP 规范版本(本文档的版本)。value/10 表示主版本号,值 mod 10 是次要版本号。

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

0x0A14= 2580

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

从adm-zip 源中提取:

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 与创建 ZIP 文件的左移操作系统。

更新:
我编写了一些简单的 JavaScript 示例函数,它们返回正确的值,verMade并从verMade.

套装版本:

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
把她的操作系统字符串。当前可能的值为dos(MS-DOS)、win32(Windows NTFS)、darwin(OS X),默认值为unix.

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

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

退货
退货verMade

获取操作系统:

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值放在这里。

返回:
以字符串形式返回操作系统。

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

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

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

返回:
从使用的 ZIP 规范返回主要版本。

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

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

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

返回:
从使用的 ZIP 规范返回次要版本。

于 2020-11-21T11:25:58.727 回答