Crates.io | yael |
lib.rs | yael |
version | |
source | src |
created_at | 2024-12-03 20:56:41.207887 |
updated_at | 2024-12-03 20:56:41.207887 |
description | Library for reading and writing numbers of a specific endianess |
homepage | |
repository | https://github.com/alexkazik/yael |
max_upload_size | |
id | 1470657 |
Cargo.toml error: | TOML parse error at line 19, column 1 | 19 | autolib = false | ^^^^^^^ unknown field `autolib`, expected one of `name`, `version`, `edition`, `authors`, `description`, `readme`, `license`, `repository`, `homepage`, `documentation`, `build`, `resolver`, `links`, `default-run`, `default_dash_run`, `rust-version`, `rust_dash_version`, `rust_version`, `license-file`, `license_dash_file`, `license_file`, `licenseFile`, `license_capital_file`, `forced-target`, `forced_dash_target`, `autobins`, `autotests`, `autoexamples`, `autobenches`, `publish`, `metadata`, `keywords`, `categories`, `exclude`, `include` |
size | 0 |
"Yet another endianness library"
This library is intended for uses where the data is not deserialized but already in ROM/RAM.
The library is no_std
, has no features and no dependencies.
The conversion is made explicit by calling new
, get
and set
.
Operations which do not depend on the byte order can be performed on integers: eq, and, or, xor, not.
But please note that a operation with a constant may be more efficient with get
ting the value
instead of wrapping the constant with new
, though depending on the constant and cpu.
There are several similar libraries, but they all differ in a some points.
Some alternatives:
#[repr(C)]
struct Chunk {
size: u32be,
checksum: u32be,
}
let chunk = Chunk { size: u32be::new(55), checksum: u32be::new(0x52f0e743) };
let chunk_size = chunk.size.get();
#[repr(C)]
struct Data {
mode: u16be,
flags: u16be,
}
fn fix_flags1(data: &mut Data){
// compare with a constant big-endian number, no conversion performed, can also be written as `data.mode.is_zero()`
if data.mode == u16be::new(0) {
// bit operations: also no conversion performed
data.flags |= u16be::new(1);
}
}
fn fix_flags2(data: &mut Data, flags_on_error: u16){
// while these get and set do perform conversion
if data.mode.get() > 80 {
data.flags.set(flags_on_error);
}
}
The #[repr(C)]
is not required by the examples, but probably in many use cases.
The floating point types do not support bit operations because a float does not either.
Comparison is not supported because it would differ from how a float behaves.
(+0 == -0
float: equal, bits: different; nan == nan
float: different, bits: equal)