我挣扎计算正确的值用于version made by
在ADM拉链。
我认为,邮编规范尚不清楚,如何找到二进制或整数值以将选项(例如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] 删除。
我来说两句