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

零脑

我挣扎计算正确的值用于version made byADM拉链

我认为邮编规范尚不清楚,如何找到二进制或整数值以将选项(例如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实用程序创建的zip才能找到此值。)

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

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

克雷杰夫

简短的介绍:

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

在您的示例中:

788 =0x0314

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

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

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

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

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

对于Windows NTFS,正确的“ version by by”值应为:

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),并且在左移OS上有一个简单的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
将她的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规范中的次要版本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在RTP标头中添加其他值/参数

如何验证标头中具有“暴击”值的JWSObject?

设置标头中的值以请求DTO

如何在标头中仅保留唯一值,并在不同行中获取与这些值相对应的值?

HTTP :: Daemon:如何在HTTP标头中为服务器设置自定义值?

如何使用React在响应标头中获取x-auth值?

如何从邮递员的响应标头中提取特定的字符串值?

如何在标头中传递令牌并在CS中检索值

如何在golang的url中为http标头中的host设置不同的值

如何用空手道模拟中的标头中的值编写方案匹配

Google Cloud Load Balancer 自定义标头中的 unicode 值如何编码?

如何使用Curl命令在标头中传递“ Content-Length”值

如何将标头中的dict作为值发送给python请求中的键“授权”?

Spring Boot API如何验证在请求标头中发送的NONCE值,以避免重播攻击

从Authorization HTTP标头中获取身份验证令牌的值

使用默认值在标头中定义静态整数

接受标头中是否需要多个值的重量值?

使用express.js在响应标头中设置令牌值

如何在Maven项目清单的Implementation-Version字段中获取git SHA1值?

如何将JPA @Version标记字段设置为显式值

如何使用Maven将Implementation-Version值添加到jar清单中?

如何使用Maven的Assembly插件向Jar清单添加Implementation-Version值?

如何在编译时检查“ #define VERSION 3.1.4”之类的值?

如何计算HMM的值?

如何计算值的总和?

如何绘制计算值?

该值如何计算?

如何计算值

在Javadoc中自动生成@version值