The previous code was relying on the to_be and to_le functions from the standard library. These now rely on macros that I wrote to handle the bit packing and unpacking. These were macros and not functions because it is really hard to define the types and capabilities needed to turn them into general functions. As such, the macros should never be published publically and the Converters should be used for conversions. The Transmutable property should be used for serialization and internally the primitive types, Elements, all use the Converter functions and any other objects should use the Transmutable primitives to build their binary forms.
85 lines
2.0 KiB
Rust
85 lines
2.0 KiB
Rust
extern crate alchemy;
|
|
extern crate sigils;
|
|
|
|
|
|
|
|
use alchemy::U64_BYTES;
|
|
use alchemy::{Endianess, Transmutable};
|
|
use sigils::vector::Vector2;
|
|
|
|
|
|
|
|
/// The size of 2 u64 whole numbers.
|
|
/// This would be different if the contained type
|
|
/// was something different, like an i16 or f32.
|
|
const SIZE_OF_VECTOR_2: usize = U64_BYTES * 2;
|
|
|
|
|
|
|
|
/// This just help pretty up the printing of an array of bytes.
|
|
fn stringify_array(buffer: &[u8]) -> String
|
|
{
|
|
let mut result: String;
|
|
let mut count: usize;
|
|
|
|
// Create a new string that starts with just
|
|
// the array opening bracket.
|
|
result = String::new();
|
|
result.push_str("[");
|
|
|
|
// Loop through the buffer keeping track
|
|
// of our place in it.
|
|
count = 0usize;
|
|
for byte in buffer
|
|
{
|
|
// Handle priting the last value differently.
|
|
if count >= buffer.len() - 1
|
|
{
|
|
result.push_str(byte.to_string().as_str());
|
|
}
|
|
else
|
|
{
|
|
result.push_str(byte.to_string().as_str());
|
|
result.push_str(", ");
|
|
}
|
|
|
|
// Mark that we are going to look at
|
|
// the next byte in the array.
|
|
count += 1;
|
|
}
|
|
|
|
// Add the array closing bracket and
|
|
// return the new String.
|
|
result.push_str("]");
|
|
result
|
|
}
|
|
|
|
|
|
pub fn main()
|
|
{
|
|
let vec: Vector2<u64>;
|
|
let final_vec: Vector2<u64>;
|
|
let endianess: Endianess;
|
|
let mut buffer: Vec<u8>;
|
|
|
|
// Initialize the variables.
|
|
vec = Vector2::<u64>::new(629u64, 1985u64);
|
|
buffer = Vec::with_capacity(SIZE_OF_VECTOR_2);
|
|
endianess = Endianess::Platform;
|
|
|
|
println!("Transmuting a Vector2:");
|
|
|
|
println!("Converting the value {} into and out of an array of bytes.",
|
|
vec);
|
|
println!("Buffer starts as: {}", stringify_array(buffer.as_slice()));
|
|
|
|
// Convert the Vector2 into an array of bytes.
|
|
buffer = vec.as_endian_bytes(endianess);
|
|
|
|
println!("Buffer contains: {}", stringify_array(buffer.as_slice()));
|
|
|
|
// Convert the array of bytes into a Vector2.
|
|
final_vec = Vector2::from_endian_bytes(buffer.as_slice(), endianess);
|
|
println!("The buffer converts back to: {}", final_vec);
|
|
}
|