finished implementing png chunks
This commit is contained in:
parent
2d5899313e
commit
9c1f66d5dc
48
src/chunk.rs
48
src/chunk.rs
@ -1,4 +1,4 @@
|
|||||||
use std::fmt::Display;
|
use std::fmt::{write, Display};
|
||||||
use crc::Crc;
|
use crc::Crc;
|
||||||
|
|
||||||
use crate::chunk_type::ChunkType;
|
use crate::chunk_type::ChunkType;
|
||||||
@ -48,11 +48,25 @@ impl Chunk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn data_as_string(&self) -> Result<String, &'static str> {
|
fn data_as_string(&self) -> Result<String, &'static str> {
|
||||||
todo!()
|
let to_stringify: Vec<u8> = self.chunk_data.clone();
|
||||||
|
|
||||||
|
if self.length() == 0 {
|
||||||
|
Err("diocane")
|
||||||
|
} else {
|
||||||
|
Ok(String::from_utf8(to_stringify).unwrap())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn as_bytes(&self) -> Vec<u8> {
|
fn as_bytes(&self) -> Vec<u8> {
|
||||||
todo!()
|
let bytes: Vec<u8> = self.length()
|
||||||
|
.to_be_bytes()
|
||||||
|
.iter()
|
||||||
|
.chain(self.chunk_type.bytes().iter())
|
||||||
|
.chain(self.chunk_data.iter())
|
||||||
|
.chain(self.crc().to_be_bytes().iter())
|
||||||
|
.copied().collect();
|
||||||
|
|
||||||
|
bytes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +94,7 @@ impl TryFrom<&[u8]> for Chunk {
|
|||||||
|
|
||||||
let mut chunk_data_vec: Vec<u8> = Vec::new();
|
let mut chunk_data_vec: Vec<u8> = Vec::new();
|
||||||
|
|
||||||
for byte in &value[(slice_length - 8)..(slice_length -4)] {
|
for byte in &value[8..(slice_length -4)] {
|
||||||
chunk_data_vec.push(*byte)
|
chunk_data_vec.push(*byte)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,14 +113,36 @@ impl TryFrom<&[u8]> for Chunk {
|
|||||||
crc: crc_from_slice,
|
crc: crc_from_slice,
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(chunk)
|
let x25: Crc<u32> = Crc::<u32>::new(&crc::CRC_32_ISO_HDLC);
|
||||||
|
|
||||||
|
let to_hash: Vec<u8> = chunk.chunk_type
|
||||||
|
.bytes()
|
||||||
|
.iter()
|
||||||
|
.chain(chunk.chunk_data.iter())
|
||||||
|
.copied()
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let crc_value = x25.checksum(&to_hash);
|
||||||
|
|
||||||
|
if crc_value != chunk.crc {
|
||||||
|
Err("Invalid bytes (probably crc is wrong)")
|
||||||
|
} else {
|
||||||
|
Ok(chunk)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Display for Chunk {
|
impl Display for Chunk {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
todo!()
|
write!(f, "chunk length:{}\nchunk type: {}\n, chunk message {}\nCRC u32: {}",
|
||||||
|
self.length,
|
||||||
|
self.chunk_type,
|
||||||
|
self.data_as_string().unwrap(),
|
||||||
|
self.crc
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user