我尝试使用以下代码循环遍历u64
的字节:
let mut message: u64 = 0x1234123412341234;
let msg = &message as *mut u8;
for b in 0..8 {
// ...some work...
}
不幸的是,Rust不允许使用类似C语言的索引方式。
虽然可以进行transmute
操作(参见@Tim的答案),但最好使用byteorder crate来保证字节序:
extern crate byteorder;
use byteorder::ByteOrder;
fn main() {
let message = 0x1234123412341234u64;
let mut buf = [0; 8];
byteorder::LittleEndian::write_u64(&mut buf, message);
for b in &buf {
// 34, 12, 34, 12, 34, 12, 34, 12,
print!("{:X}, ", b);
}
println!("");
byteorder::BigEndian::write_u64(&mut buf, message);
for b in &buf {
// 12, 34, 12, 34, 12, 34, 12, 34,
print!("{:X}, ", b);
}
}
将转换为数组[u8; 8]
是安全的:
let message_arr: [u8; 8] = unsafe { mem::transmute(message) };
for b in &message_arr {
println!("{}", b)
}
在playground上看到这个实例。
char
(以及[un
]signed char
)是严格别名规则的明确例外,因此可以在严格符合C的情况下轻松编写此代码。实际行为是实现定义的,但不是未定义的。 - trent