在Rust中,循环遍历整数数字的惯用方式是什么?

3

我尝试使用以下代码循环遍历u64的字节:

let mut message: u64 = 0x1234123412341234;
let msg = &message as *mut u8;

for b in 0..8 {
    // ...some work...
}

不幸的是,Rust不允许使用类似C语言的索引方式。


这段C代码会实现一种行为,因此很难完全理解您的意图。顺便说一下,如果我们谈论严格遵守规范,这段C代码将是未定义的行为。 - Stargateur
1
@Stargateur char(以及[un]signed char)是严格别名规则的明确例外,因此可以在严格符合C的情况下轻松编写此代码。实际行为是实现定义的,但不是未定义的。 - trent
2个回答

5

虽然可以进行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);
    }
}

(玩耍的氛围链接)

3

将转换为数组[u8; 8]是安全的:

let message_arr: [u8; 8] = unsafe { mem::transmute(message) };
for b in &message_arr {
    println!("{}", b)
}

playground上看到这个实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接