* .tgz file - читать заголовки флагов (для манипулирования ими позже) - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь прочитать и манипулировать заголовком tar-файла gzip.

Не удается прочитать и распечатать биты, хранящиеся в байте FLG.

const fs = require("fs");

fs.readFile("./test-plugin.tgz", (err, bytes) => {

    if (err) {
        console.log(err);
        process.exit(100);
    }

    console.log("IDentification 1&2: %d-%d", bytes[0], bytes[1]);
    console.log("Compression method: %d", bytes[2]);
    console.log("Flags", bytes[3]);

    // | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 
    // +---+---+---+---+---+---+---+---+---+---+
    // |ID1|ID2|CM |FLG|     MTIME     |XFL|OS | (more-->)
    // +---+---+---+---+---+---+---+---+---+---+
    //
    //
    // +---+---+=================================+
    // | XLEN  |...XLEN bytes of "extra field"...| (more-->)
    // +---+---+=================================+
    // (if FLG.FEXTRA set) 
    //
    // FLG byte - bits
    // bit 0   FTEXT
    // bit 1   FHCRC
    // bit 2   FEXTRA
    // bit 3   FNAME
    // bit 4   FCOMMENT
    // bit 5   reserved
    // bit 6   reserved
    // bit 7   reserved

    // readInt8(3); -> 0
    // readIntBE(3, 1); -> 0
    // readIntLE(3, 1); -> 0
    // readUInt8(3) -> 0
    // readUIntBE(3, 1) -> 0
    // readUIntLE(3, 1); -> 0
    let flags = bytes.readUIntLE(3, 1);

    console.log(flags)



});

Где моя ошибка? Все, что я пробовал, мое единственное значение, которое я получаю, равно 0.

Моя цель - прочитать и манипулировать заголовком, чтобы я мог установить «дополнительное поле» в файле *.tgz. Но поэтому я должен сначала прочитать флаги.

Документацию к заголовку gzip можно найти здесь: - http://www.zlib.org/rfc-gzip.html - https://tools.ietf.org/html/rfc1952

Любая помощь приветствуется


РЕДАКТИРОВАТЬ:

Основано на этом сообщении ( Как создать файл gzip с полями FEXTRA & FCOMMENT ) я могу Теперь создайте демонстрационные файлы.

Теперь байт флага установлен на 28 (со строкой комментария) или 12 (без строки комментария)

use IO::Compress::Gzip qw(gzip $GzipError);

gzip \"payload" => "./test.gz", 
     Name       => "filename", 
     #Comment    => "This is a comment", 
     ExtraField => [ "ab" => "cde"] 
  or die "Cannot create gzip file: $GzipError" ;

Что (я предполагаю) знаю, что нужно выяснить, это "битовая маскировка" "для флагов?

РЕДАКТИРОВАТЬ 2: Я нашел код" magi c ", который делает то, что я хочу:


    // bitwise operation on header flags
    const FLAG_RESERVED_3 = (bytes[3] >> 7) & 1;
    const FLAG_RESERVED_2 = (bytes[3] >> 6) & 1;
    const FLAG_RESERVED_1 = (bytes[3] >> 5) & 1;
    const FLAG_COMMENT = (bytes[3] >> 4) & 1;
    const FLAG_NAME = (bytes[3] >> 3) & 1;
    const FLAG_EXTRA = (bytes[3] >> 2) & 1;
    const FLAG_CRC = (bytes[3] >> 1) & 1;
    const FLAG_TEXT = (bytes[3] >> 0) & 1;


    console.log("FLAG_RESERVED_3", FLAG_RESERVED_3);
    console.log("FLAG_RESERVED_2", FLAG_RESERVED_2);
    console.log("FLAG_RESERVED_1", FLAG_RESERVED_1);
    console.log("FLAG_COMMENT", FLAG_COMMENT);
    console.log("FLAG_NAME", FLAG_NAME);
    console.log("FLAG_EXTRA", FLAG_EXTRA);
    console.log("FLAG_CRC", FLAG_CRC);
    console.log("FLAG_TEXT", FLAG_TEXT);
    console.log();

...