This link ma więcej informacji niż cokolwiek innego, udało mi się znaleźć na sieć. Nawet źródło zip nie ma nic. Kopiowanie odpowiedniej sekcji dla potomności. Ta poprawka tak naprawdę nie polega na dokumentowaniu tego formatu, co pokazuje, jak żałosna (czytaj nieistniejąca) jest aktualna dokumentacja.
# external_attr is 4 bytes in size. The high order two
# bytes represent UNIX permission and file type bits,
# while the low order two contain MS-DOS FAT file
# attributes, most notably bit 4 marking directories.
if node.isfile:
zipinfo.compress_type = ZIP_DEFLATED
zipinfo.external_attr = 0644 << 16L # permissions -r-wr--r--
data = node.get_content().read()
properties = node.get_properties()
if 'svn:special' in properties and \
data.startswith('link '):
data = data[5:]
zipinfo.external_attr |= 0120000 << 16L # symlink file type
zipinfo.compress_type = ZIP_STORED
if 'svn:executable' in properties:
zipinfo.external_attr |= 0755 << 16L # -rwxr-xr-x
zipfile.writestr(zipinfo, data)
elif node.isdir and path:
if not zipinfo.filename.endswith('/'):
zipinfo.filename += '/'
zipinfo.compress_type = ZIP_STORED
zipinfo.external_attr = 040755 << 16L # permissions drwxr-xr-x
zipinfo.external_attr |= 0x10 # MS-DOS directory flag
zipfile.writestr(zipinfo, '')
Również, this link ma następujące. Tutaj bajt niskiego rzędu prawdopodobnie oznacza prawy (najniższy) bajt czterech bajtów. Tak więc ten jest dla MS-DOS i prawdopodobnie można go pozostawić jako zero w przeciwnym razie. Atrybuty
plik zewnętrzny (4 bajty)
The mapping of the external attributes is
host-system dependent (see 'version made by'). For
MS-DOS, the low order byte is the MS-DOS directory
attribute byte. If input came from standard input, this
field is set to zero.
Również plik źródłowy UNIX/unix.c w źródłach programu zip InfoZip za pobrane od Debian's archives ma następujące w komentarzach.
/* lower-middle external-attribute byte (unused until now):
* high bit => (have GMT mod/acc times) >>> NO LONGER USED! <<<
* second-high bit => have Unix UID/GID info
* NOTE: The high bit was NEVER used in any official Info-ZIP release,
* but its future use should be avoided (if possible), since it
* was used as "GMT mod/acc times local extra field" flags in Zip beta
* versions 2.0j up to 2.0v, for about 1.5 years.
*/
Tak więc biorąc pod uwagę to wszystko, wygląda na to, że jest używany tylko drugi najwyższy bajt, przynajmniej dla Uniksa.
EDYCJA: Pytałem o Unixowy aspekt tego na Unix.SX, w pytaniu "The zip format's external file attribute". Wygląda na to, że mam kilka złych rzeczy. W szczególności oba dwa najwyższe bajty są używane w systemie Unix.
Byłoby to bardziej czytelne, gdyby zdefiniowano bufor, nazwę i bajty w przykładzie. –
Na pewno dodano kilka przykładowych definicji. – Tom
Dla Pythona 3, napiszesz to '0o777 << 16' –