fix: bit walker
This commit is contained in:
parent
2a07d725bf
commit
ed4277ac8f
50
src/main.zig
50
src/main.zig
@ -38,6 +38,7 @@ const BitWalker = struct {
|
|||||||
// TODO direction
|
// TODO direction
|
||||||
fn walk(self: *Self, bits: u3) !u8 {
|
fn walk(self: *Self, bits: u3) !u8 {
|
||||||
if (bits > 8 or bits == 0) return error.invalid_bit_number;
|
if (bits > 8 or bits == 0) return error.invalid_bit_number;
|
||||||
|
|
||||||
var byte = self.data.ptr[self.position];
|
var byte = self.data.ptr[self.position];
|
||||||
|
|
||||||
// jumps over bytes
|
// jumps over bytes
|
||||||
@ -45,26 +46,29 @@ const BitWalker = struct {
|
|||||||
// Generate a mast that covers the last part of the old byte
|
// Generate a mast that covers the last part of the old byte
|
||||||
var old_mask: u8 = 0;
|
var old_mask: u8 = 0;
|
||||||
var i: usize = 0;
|
var i: usize = 0;
|
||||||
while (i < bits - self.in_byte_position) : (i += 1) {
|
while (i < 8 - @as(u4, self.in_byte_position)) : (i += 1) {
|
||||||
old_mask = @shlExact(old_mask, 1) + 1;
|
old_mask = @shlExact(old_mask, 1) + 1;
|
||||||
}
|
}
|
||||||
old_mask = @shlExact(old_mask, self.in_byte_position);
|
old_mask = @shlExact(old_mask, self.in_byte_position);
|
||||||
|
|
||||||
var next_byte = self.data.ptr[self.position + 1];
|
var next_byte = self.data.ptr[self.position + 1];
|
||||||
var new_byte_pos: u3 = self.in_byte_position + bits % 8;
|
var new_byte_pos: u3 = @intCast(u3, @as(u4, bits) - (8 - @as(u4, self.in_byte_position)));
|
||||||
|
|
||||||
var new_mask: u8 = 0;
|
var new_mask: u8 = 0;
|
||||||
var j: usize = 0;
|
var j: usize = 0;
|
||||||
while (j < new_byte_pos) : (j += 1) {
|
while (j < new_byte_pos) : (j += 1) {
|
||||||
new_mask = @shlExact(new_mask, 1) + 1;
|
new_mask = @shlExact(new_mask, 1) + 1;
|
||||||
}
|
}
|
||||||
print("{} mask: {b}, new_mask", .{ bits, old_mask, new_mask });
|
//print("{} mask: {b}, new_mask: {b}", .{ bits, old_mask, new_mask });
|
||||||
print("here {b} {b}", .{ byte, old_mask });
|
//print("here {b} {b}", .{ byte, old_mask });
|
||||||
print("here_new {b} {b}", .{ next_byte, new_mask });
|
//print("here_new {b} {b}", .{ next_byte, new_mask });
|
||||||
|
|
||||||
|
var result = @shrExact(byte & old_mask, self.in_byte_position) + @shlExact(next_byte & new_mask, @intCast(u3, 8 - @as(u4, self.in_byte_position)));
|
||||||
|
|
||||||
self.position += 1;
|
self.position += 1;
|
||||||
self.in_byte_position = new_byte_pos;
|
self.in_byte_position = new_byte_pos;
|
||||||
return byte & old_mask + next_byte & new_mask;
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate a mast that covers the last part of the old byte
|
// Generate a mast that covers the last part of the old byte
|
||||||
@ -75,14 +79,15 @@ const BitWalker = struct {
|
|||||||
}
|
}
|
||||||
old_mask = @shlExact(old_mask, self.in_byte_position);
|
old_mask = @shlExact(old_mask, self.in_byte_position);
|
||||||
|
|
||||||
if (self.in_byte_position + bits == 8) {
|
|
||||||
self.position += 1;
|
|
||||||
self.in_byte_position = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const result = @shrExact(byte & old_mask, self.in_byte_position);
|
const result = @shrExact(byte & old_mask, self.in_byte_position);
|
||||||
|
|
||||||
self.in_byte_position += bits;
|
const sum = @intCast(u4, self.in_byte_position) + @intCast(u4, bits);
|
||||||
|
if (sum == 8) {
|
||||||
|
self.position += 1;
|
||||||
|
self.in_byte_position = 0;
|
||||||
|
} else {
|
||||||
|
self.in_byte_position += bits;
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -164,22 +169,11 @@ const ZipFileHeader = struct {
|
|||||||
|
|
||||||
var bitw = BitWalker.init(&self.compressed_content, false);
|
var bitw = BitWalker.init(&self.compressed_content, false);
|
||||||
|
|
||||||
var lastBlock1 = try bitw.walk(1);
|
var lastBlock = try bitw.walk(1) == 1;
|
||||||
var blockType1 = try bitw.walk(2);
|
var blockType = try bitw.walk(2);
|
||||||
var number_of_literal_codes1 = try bitw.walk(5);
|
var number_of_literal_codes = try bitw.walk(5);
|
||||||
var number_of_dist_codes1 = try bitw.walk(5);
|
var number_of_dist_codes = try bitw.walk(5);
|
||||||
|
var number_of_length_codes = try bitw.walk(5);
|
||||||
print("{} {} {} {}", .{ lastBlock1, blockType1, number_of_literal_codes1, number_of_dist_codes1 });
|
|
||||||
|
|
||||||
var byte = self.compressed_content[0];
|
|
||||||
var lastBlock = byte & 0b0000_0001 == 0b0000_0001;
|
|
||||||
var blockType = @shrExact(byte & 0b0000_0110, 1);
|
|
||||||
var number_of_literal_codes = @shrExact(byte & 0b1111_1000, 3); // 256
|
|
||||||
byte = self.compressed_content[1];
|
|
||||||
var number_of_dist_codes = byte & 0b0001_1111;
|
|
||||||
var next_byte = self.compressed_content[2];
|
|
||||||
var number_of_length_codes = @shrExact(byte & 0b1110_0000, 5) + @shlExact(next_byte & 0b0000_0001, 3);
|
|
||||||
byte = next_byte;
|
|
||||||
|
|
||||||
if (lastBlock) {
|
if (lastBlock) {
|
||||||
print("last block", .{});
|
print("last block", .{});
|
||||||
|
Loading…
Reference in New Issue
Block a user