如何在&[u8]中编写u32?

时间:2018-12-02 22:40:21

标签: casting rust

我正在尝试渲染图像。我编写了一个put_pixel函数,将RGBA像素写入表示图像的数组中。

图像是一维数组,其中包含i8个值(每个字节都是颜色的一部分)。我想一步来写颜色。

fn put_pixel(x: u16, y: u16, color: u32, width: u16, height: u16, buffer: &[u8]) {
    let index = 0; // I'll calculate the right index later.
    buffer[index] as u32 = color; // I want to write the color here.
}

所以,这给了我一个错误,说

45 |     buffer[index] = color;
   |                     ^^^^^ expected u8, found u32

听起来很合理,但是我不知道如何将像素“投射”到阵列中。

3 个答案:

答案 0 :(得分:4)

  

听起来很合理,但是我不知道如何将像素“投射”到阵列中。

u8的引用转换为u32的引用是不安全的。而且,如果编译器允许您将类型u32的值分配给u8,则它可能没有按预期的方式工作,因为该值必须被截断为单个组件,以便它将适合单个切片元素。

话虽如此,通常使用byteorder从切片或其他二进制数据流中读取和写入此类类型。

use byteorder::{LittleEndian, WriteBytesExt};

fn put_pixel(x: u16, y: u16, color: u32, width: u16, height: u16, buffer: &mut [u8]) {
    let index = unimplemented!();
    buffer[index..].write_u32::<LittleEndian>(color).unwrap();
}

答案 1 :(得分:3)

使用@Column(columnDefinition="CHAR")条板箱:

byteorder

Link to playground.

答案 2 :(得分:0)

来源-https://users.rust-lang.org/t/how-to-serialize-a-u32-into-byte-array/986/5

fn u32_to_u8_array(x: u32) -> [u8; 4] {
  let b1: u8 = ((x >> 24) & 0xff) as u8;
  let b2: u8 = ((x >> 16) & 0xff) as u8;
  let b3: u8 = ((x >> 8) & 0xff) as u8;
  let b4: u8 = (x & 0xff) as u8;
  
  [b1, b2, b3, b4]
}