Я пытаюсь прочитать и манипулировать заголовком 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();