如何计算 zip header 中“version by”的值?
How to compute the value for `version made by` in zip header?
我正在努力计算 adm-zip 中 version 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
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 规范的次要版本。
我正在努力计算 adm-zip 中 version 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
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 规范的次要版本。