#[derive(Debug)]
struct Color {
red: u8,
green: u8,
blue: u8,
}
fn main() {
for color in [
Color { red: 128, green: 255, blue: 90 },
Color { red: 0, green: 3, blue: 254 },
Color { red: 0, green: 0, blue: 0 },
].iter() {
println!("{}", *color)
}
}
动手试一试
为上面的 Color
结构体实现 fmt::Display
,应得到如下的输出结果:
RGB (128, 255, 90) 0x80FF5A
RGB (0, 3, 254) 0x0003FE
RGB (0, 0, 0) 0x000000
重点在于最后16进制RGB码进制数的计算,这个16进制数实际上是按位拼合
11111111, 11111111, 11111111
3组0~255二进制数,拼合成FF FF FF
第一种方式是计算出这个数
let r = self.red as u32 * 0x10000;
let g = self.green as u32 * 0x100;
let b = self.blue as u32;
write!(f, "RGB ({}, {}, {}) 0x{:>06X}", self.red, self.green, self.blue, r + g + b)
- Red乘以十六进制的
0x10000
,可以变为0xFF0000
- Green乘以十六进制的
0x100
,可以变成0xFF00
- Blue不变,为
0xFF
注意,原本数字为u8
,在此6位16进制数,相当于24位2进制数。我们选用32位无符号数来承载。先强转,再乘十六进制。注意在输出时,需要补0到6位
第二种为取巧
write!(f, "RGB ({0}, {1}, {2}) 0x{0:>02X}{1:>02X}{2:>02X}", self.red, self.green, self.blue)
我们不将其计算,而是单纯在视觉上用字符串拼接的方式组合出来。
注意R,G,B分为占2位,都需要补0到2位


网友评论