Как мне написать u32 в & [u8]? - PullRequest
       42

Как мне написать u32 в & [u8]?

0 голосов
/ 03 декабря 2018

Я пытаюсь сделать изображение.Я написал 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

Звучит логично, но я не знаю, как«бросить» пиксель в массив.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Звучит логично, но я не знаю, как "привести" пиксель в массив.

Преобразование ссылки 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();
}
0 голосов
/ 03 декабря 2018

Используйте ящик byteorder:

extern crate byteorder; // 1.2.7

use byteorder::ByteOrder;

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

    byteorder::NativeEndian::write_u32(&mut buffer[index..index+4], color);
}

Ссылка на игровую площадку.

...