我有一个未知大小的数组,我想获得该数组的一部分并将其转换为静态大小的数组:
fn pop(barry: &[u8]) -> [u8; 3] {
barry[0..3] // mismatched types: expected `[u8, ..3]` but found `&[u8]`
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
我在文档中找不到Vec<T>
如何从指定范围中检索切片.
标准库中是否有类似的东西:
let a = vec![1, 2, 3, 4];
let suba = a.subvector(0, 2); // Contains [1, 2];
Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的Rust代码示例,无法编译:
extern crate rustc_serialize;
use rustc_serialize::base64;
fn main() {
let auth = format!("{}:{}", "user", "password");
let auth_b64 = auth.as_bytes().to_base64(base64::MIME);
println!("Authorization string: {}", auth_b64);
}
Run Code Online (Sandbox Code Playgroud)
编译错误:
error[E0599]: no method named `to_base64` found for type `&[u8]` in the current scope
--> src/main.rs:6:36
|
6 | let auth_b64 = auth.as_bytes().to_base64(base64::MIME);
| ^^^^^^^^^
|
= help: items from traits can only be used if the trait is in scope
= note: the following trait is implemented but not in scope, perhaps add a `use` …
Run Code Online (Sandbox Code Playgroud) 我在将Vec<u16>
内容写入文件时遇到问题:
use std::fs::File;
use std::io::{Write, BufWriter};
use std::mem;
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum ImageFormat {
GrayScale,
Rgb32,
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct ImageHeader {
pub width: usize,
pub height: usize,
pub format: ImageFormat,
}
pub struct Image {
pub header: ImageHeader,
pub data: Vec<u16>,
}
fn write_to_file(path: &str, img: &Image) -> std::io::Result<()> {
let f = try!(File::create(path));
let mut bw = BufWriter::new(f);
let slice = &img.data[..];
println!("before length: {}", slice.len());
let sl: &[u8];
unsafe { …
Run Code Online (Sandbox Code Playgroud) 我可以以某种方式获得一个数组std::ptr::read
吗?
我想做一些接近的事情:
let mut v: Vec<u8> = ...
let view = &some_struct as *const _ as *const u8;
v.write(&std::ptr::read<[u8, ..30]>(view));
Run Code Online (Sandbox Code Playgroud)
哪个在此表单中无效(不能使用数组签名).
我有一个i32
传递到我的键值数据库的。
let a = 1234i32;
db.put(&a.to_be_bytes());
Run Code Online (Sandbox Code Playgroud)
但我把它恢复为&[u8]
,如何将其转换回i32
?
更新:这个例子几乎满足了我的要求。
use std::convert::TryInto;
fn read_be_i32(input: &[u8]) -> i32 {
i32::from_be_bytes(input.try_into().unwrap())
}
Run Code Online (Sandbox Code Playgroud) 我有一个,&[u8]
并希望把它变成一个&[u8; 3]
没有复制.它应该引用原始数组.我怎样才能做到这一点?
以下 Rust 代码无法编译。
extern create byteorder;
use byetorder::{LittleEndian, ReadBytesExt};
fn main() {
let buf: [u8; 12] = [
0x00, 0x42, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x30,
];
let id = &buf[0..1].read_u16::<LittleEndian>(); }
Run Code Online (Sandbox Code Playgroud)
来自编译器的消息:
extern create byteorder;
use byetorder::{LittleEndian, ReadBytesExt};
fn main() {
let buf: [u8; 12] = [
0x00, 0x42, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x30,
];
let id = &buf[0..1].read_u16::<LittleEndian>(); }
Run Code Online (Sandbox Code Playgroud)
u16
Stack Overflow 上有非常相似的问题,我已经评论过,但我的问题与那些问题略有不同,因为我试图从切片中读取 a 。在实践中,我不确定为什么我的例子有本质上的不同,我确信我错过了一些明显的东西。
具体来说,我不清楚我所得到的与此处接受的答案中的内容有何显着不同:
我如何转换Vec<u32>
为字节,这样[1, 2, 4]
应该给我[1, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0]
, 并获取逆字节并将它们转换回整数向量?
我只知道如何转换[u8; 4]
成整数。