struct Header [src]

Fields

block_type: BlockType
size_format: u2
regenerated_size: u20
compressed_size: ?u18

Members

Source

pub const Header = struct { block_type: BlockType, size_format: u2, regenerated_size: u20, compressed_size: ?u18, /// Decode a literals section header. pub fn decode(in: *Reader, remaining: *Limit) !Header { remaining.* = remaining.subtract(1) orelse return error.EndOfStream; const byte0 = try in.takeByte(); const block_type: BlockType = @enumFromInt(byte0 & 0b11); const size_format: u2 = @intCast((byte0 & 0b1100) >> 2); var regenerated_size: u20 = undefined; var compressed_size: ?u18 = null; switch (block_type) { .raw, .rle => { switch (size_format) { 0, 2 => { regenerated_size = byte0 >> 3; }, 1 => { remaining.* = remaining.subtract(1) orelse return error.EndOfStream; regenerated_size = (byte0 >> 4) + (@as(u20, try in.takeByte()) << 4); }, 3 => { remaining.* = remaining.subtract(2) orelse return error.EndOfStream; regenerated_size = (byte0 >> 4) + (@as(u20, try in.takeByte()) << 4) + (@as(u20, try in.takeByte()) << 12); }, } }, .compressed, .treeless => { remaining.* = remaining.subtract(2) orelse return error.EndOfStream; const byte1 = try in.takeByte(); const byte2 = try in.takeByte(); switch (size_format) { 0, 1 => { regenerated_size = (byte0 >> 4) + ((@as(u20, byte1) & 0b00111111) << 4); compressed_size = ((byte1 & 0b11000000) >> 6) + (@as(u18, byte2) << 2); }, 2 => { remaining.* = remaining.subtract(1) orelse return error.EndOfStream; const byte3 = try in.takeByte(); regenerated_size = (byte0 >> 4) + (@as(u20, byte1) << 4) + ((@as(u20, byte2) & 0b00000011) << 12); compressed_size = ((byte2 & 0b11111100) >> 2) + (@as(u18, byte3) << 6); }, 3 => { remaining.* = remaining.subtract(2) orelse return error.EndOfStream; const byte3 = try in.takeByte(); const byte4 = try in.takeByte(); regenerated_size = (byte0 >> 4) + (@as(u20, byte1) << 4) + ((@as(u20, byte2) & 0b00111111) << 12); compressed_size = ((byte2 & 0b11000000) >> 6) + (@as(u18, byte3) << 2) + (@as(u18, byte4) << 10); }, } }, } return .{ .block_type = block_type, .size_format = size_format, .regenerated_size = regenerated_size, .compressed_size = compressed_size, }; } }