| Crates.io | bytecraft |
| lib.rs | bytecraft |
| version | 0.2.4 |
| created_at | 2025-09-23 19:00:07.437425+00 |
| updated_at | 2025-10-31 20:14:30.218713+00 |
| description | A flexible and efficient library for reading and writing binary data in Rust. |
| homepage | |
| repository | https://github.com/Igor743646/bytecraft |
| max_upload_size | |
| id | 1851973 |
| size | 190,032 |
A high-performance, type-safe binary data reading and writing library for Rust with compile-time endianness support and zero-cost abstractions.
Add this to your Cargo.toml:
[dependencies]
bytecraft = "0.2"
See ChangeLog.md.
The bytecraft crate now supports 1.89.0 rust version.
use bytecraft::{ByteReader, ByteWriter, Endian};
// Reading binary data
let data = [0x01, 0x02, 0x03, 0x04];
let mut reader = ByteReader::new(&data[..]);
let first_byte: u8 = reader.read().unwrap();
let word: u16 = reader.read().unwrap();
// Writing binary data
let mut buffer = [0u8; 10];
let mut writer = ByteWriter::new(&mut buffer[..]);
writer.write(&42u32).unwrap();
writer.write_exact("Hello".as_bytes()).unwrap();
// Complex structures
#[derive(Debug, PartialEq)]
struct Point {
x: f32,
y: f32,
}
impl<'a> Readable<'a> for Point {
fn read<'r>(mut stream: ReadStream<'a, 'r>) -> Result<Self> {
Ok(Point {
x: stream.read()?,
y: stream.read()?,
})
}
}
impl Writable for Point {
fn write<T>(mut stream: WriteStream<T>, val: &Self) -> Result<()>
where
T: AsRef<[u8]> + AsMut<[u8]>,
{
stream.write(&val.x)?;
stream.write(&val.y)?;
Ok(())
}
}
use bytecraft::{ByteReader, SeekFrom};
let mut reader = ByteReader::new(data);
reader.skip(10)?; // Skip 10 bytes forward
reader.rewind(5)?; // Rewind 5 bytes backward
reader.seek(SeekFrom::Start(0))?; // Seek to beginning
reader.seek(SeekFrom::End(-4))?; // Seek 4 bytes from end
use bytecraft::{ByteReader, Endian};
let mut reader = ByteReader::with_endian(data, Endian::Big);
let value: u32 = reader.read()?; // Big-endian reading
reader.set_endian(Endian::Little);
let value: u32 = reader.read()?; // Little-endian reading
// Peek at data without consuming it
let preview: u32 = reader.peek()?;
assert_eq!(reader.position(), 0); // Position unchanged
// Read and consume
let actual: u32 = reader.read()?;
assert_eq!(preview, actual);
// Length-prefixed collections
let vec: Vec<u32> = reader.read()?; // Reads length + elements
let string: String = reader.read()?; // Reads length + UTF-8 data
let cstring: CString = reader.read()?; // Reads null-terminated data
no_std support.Other crates for byte manipulation, reading, writing:
Bytecraft is under the terms of: