代码之家  ›  专栏  ›  技术社区  ›  hedgar2017

在rust中循环整数字节的惯用方法是什么?[副本]

  •  2
  • hedgar2017  · 技术社区  · 8 年前

    我试着用这样一段代码循环 u64 :

    let mut message: u64 = 0x1234123412341234;
    let msg = &message as *mut u8;
    
    for b in 0..8 {
        // ...some work...
    }
    

    不幸的是,Rust不允许这样的C类索引。

    2 回复  |  直到 8 年前
        1
  •  5
  •   Shepmaster Tim Diekmann    8 年前

    同时 transmute -ING是可能的( see @Tim's answer )最好使用 the 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);
        }
    }
    

    ( Permalink to the playground )

        2
  •  3
  •   Shepmaster Tim Diekmann    8 年前

    转化是安全的 u64 [u8; 8] :

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

    看到这个行动 on the playground .