dynamixel2/
endian.rs

1/// Write a u8 to a buffer in little endian format.
2///
3/// Although endianness has no meaning for single-byte values,
4/// having this function keeps the code consistent and easier to read.
5pub fn write_u8_le(buffer: &mut [u8], value: u8) {
6	buffer[0] = value;
7}
8
9/// Read a u8 from a buffer in little endian format.
10///
11/// Although endianness has no meaning for single-byte values,
12/// having this function keeps the code consistent and easier to read.
13pub fn read_u8_le(buffer: &[u8]) -> u8 {
14	buffer[0]
15}
16
17/// Write a u16 to a buffer in little endian format.
18pub fn write_u16_le(buffer: &mut [u8], value: u16) {
19	buffer[0] = (value & 0xFF) as u8;
20	buffer[1] = (value >> 8 & 0xFF) as u8;
21}
22
23/// Read a u16 in little endian format from a buffer.
24pub fn read_u16_le(buffer: &[u8]) -> u16 {
25	let low = buffer[0] as u16;
26	let high = buffer[1] as u16;
27	low | high << 8
28}
29
30/// Write a u32 to a buffer in little endian format.
31pub fn write_u32_le(buffer: &mut [u8], value: u32) {
32	write_u16_le(&mut buffer[0..2], (value & 0xFFFF) as u16);
33	write_u16_le(&mut buffer[2..4], (value >> 16 & 0xFFFF) as u16);
34}
35
36/// Read a u32 in little endian format from a buffer.
37pub fn read_u32_le(buffer: &[u8]) -> u32 {
38	let low = read_u16_le(&buffer[0..2]) as u32;
39	let high = read_u16_le(&buffer[2..4]) as u32;
40	low | high << 16
41}
42
43#[cfg(test)]
44mod test {
45	use super::*;
46	use assert2::assert;
47
48	#[test]
49	fn test_write_u16_le() {
50		let mut buffer = [0xFF; 4];
51		write_u16_le(&mut buffer[0..], 0x0000);
52		assert!(buffer == [0x00, 0x00, 0xFF, 0xFF]);
53
54		write_u16_le(&mut buffer[2..], 0x1234);
55		assert!(buffer == [0x00, 0x00, 0x34, 0x12]);
56	}
57
58	#[test]
59	fn test_read_u16_le() {
60		assert!(read_u16_le(&[0x00, 0x00, 0x34, 0x12]) == 0);
61		assert!(read_u16_le(&[0x34, 0x12]) == 0x1234);
62	}
63
64	#[test]
65	fn test_write_u32_le() {
66		let mut buffer = [0xFF; 8];
67		write_u32_le(&mut buffer[0..], 0x0000);
68		assert!(buffer == [0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF]);
69
70		write_u32_le(&mut buffer[4..], 0x12345678);
71		assert!(buffer == [0x00, 0x00, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12]);
72	}
73
74	#[test]
75	fn test_read_u32_le() {
76		assert!(read_u32_le(&[0x00, 0x00, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12]) == 0);
77		assert!(read_u32_le(&[0x78, 0x56, 0x34, 0x12]) == 0x12345678);
78	}
79}