add crc
This commit is contained in:
parent
99ecf178df
commit
3f521b5754
4 changed files with 277 additions and 5 deletions
|
|
@ -220,6 +220,31 @@ impl FileHeader {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn set_uncompressed_size(&mut self, uncompressed_size: u64) {
|
||||
if let Some(ExtraField::Zip64(Zip64ExtraField {
|
||||
original_size: Some(original_size),
|
||||
..
|
||||
})) = self
|
||||
.extra_field
|
||||
.iter_mut()
|
||||
.find(|f| matches!(f, ExtraField::Zip64(_)))
|
||||
{
|
||||
*original_size = uncompressed_size;
|
||||
self.uncompressed_size = u32::MAX;
|
||||
} else if uncompressed_size > u32::MAX as u64 {
|
||||
self.extra_field.push(ExtraField::Zip64(Zip64ExtraField {
|
||||
original_size: Some(uncompressed_size),
|
||||
compressed_size: Some(self.compressed_size as u64),
|
||||
disk_number: None,
|
||||
offset_header: None,
|
||||
}));
|
||||
self.uncompressed_size = u32::MAX;
|
||||
self.compressed_size = u32::MAX;
|
||||
} else {
|
||||
self.uncompressed_size = uncompressed_size as u32;
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_compressed_size(&self) -> u64 {
|
||||
if self.compressed_size != u32::MAX {
|
||||
self.compressed_size as u64
|
||||
|
|
@ -237,6 +262,31 @@ impl FileHeader {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn set_compressed_size(&mut self, compressed_size: u64) {
|
||||
if let Some(ExtraField::Zip64(Zip64ExtraField {
|
||||
compressed_size: Some(compressed_size_),
|
||||
..
|
||||
})) = self
|
||||
.extra_field
|
||||
.iter_mut()
|
||||
.find(|f| matches!(f, ExtraField::Zip64(_)))
|
||||
{
|
||||
*compressed_size_ = compressed_size;
|
||||
self.compressed_size = u32::MAX;
|
||||
} else if compressed_size > u32::MAX as u64 {
|
||||
self.extra_field.push(ExtraField::Zip64(Zip64ExtraField {
|
||||
original_size: Some(self.uncompressed_size as u64),
|
||||
compressed_size: Some(compressed_size),
|
||||
disk_number: None,
|
||||
offset_header: None,
|
||||
}));
|
||||
self.uncompressed_size = u32::MAX;
|
||||
self.compressed_size = u32::MAX;
|
||||
} else {
|
||||
self.compressed_size = compressed_size as u32;
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_offset_local_header(&self) -> u64 {
|
||||
if self.offset_local_header != u32::MAX {
|
||||
self.offset_local_header as u64
|
||||
|
|
@ -254,6 +304,32 @@ impl FileHeader {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn set_offset_local_header(&mut self, offset: u64) {
|
||||
if let Some(ExtraField::Zip64(Zip64ExtraField {
|
||||
offset_header: Some(offset_header),
|
||||
..
|
||||
})) = self
|
||||
.extra_field
|
||||
.iter_mut()
|
||||
.find(|f| matches!(f, ExtraField::Zip64(_)))
|
||||
{
|
||||
*offset_header = offset;
|
||||
self.offset_local_header = u32::MAX;
|
||||
} else if offset > u32::MAX as u64 {
|
||||
self.extra_field.push(ExtraField::Zip64(Zip64ExtraField {
|
||||
original_size: Some(self.uncompressed_size as u64),
|
||||
compressed_size: Some(self.compressed_size as u64),
|
||||
disk_number: None,
|
||||
offset_header: Some(offset),
|
||||
}));
|
||||
self.uncompressed_size = u32::MAX;
|
||||
self.compressed_size = u32::MAX;
|
||||
self.offset_local_header = u32::MAX;
|
||||
} else {
|
||||
self.offset_local_header = offset as u32;
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_disk_number_start(&self) -> u32 {
|
||||
if self.disk_number_start != u16::MAX {
|
||||
self.disk_number_start as u32
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue