我正在尝试提取usize
的字节以在u8
数组中检索它们,但似乎无法初始化具有“运行时已知”大小的数组。
这是我的代码:
use std::mem;
use std::mem::transmute;
fn encodeString(value: &str) {
let length: usize = value.len(); // retrieval of the size
let lengthSize: usize = mem::size_of_val(&length); // I am on 64-bit so it is 8
let lengthBytes: [u8; lengthSize] = unsafe { transmute(lengthSize.to_be() }; // BAM. Does not want to compile because of the lengthSize
}
fn main() {
encodeString("Coucou");
}
我尝试使用lengthSize
代替const
将let
变量设置为常量,但是,正如您将注意到的那样,我有一个错误,即它不是“常量”。< / p>
因为我没有成功地做我想要的事情,所以我尝试了另一种方法,使用Vec
但是...我有另外一个关于它的大小的错误,我没有找到我如何强制使用{ {1}}仅包含8个Vec
条目:
u8
也许我将let lengthBytes: Vec<u8> = unsafe { transmute(length.to_be()) }; // BAM. 15:50 error: transmute called with differently sized types: usize (64 bits) to std::vec::Vec<u8> (192 bits) [E0512]
转换为字符串,然后将其转换回usize
数组?但这似乎是......过度杀伤。
====我的解决方案
所以......我通过旋转位找到了另一种方法。这是我的代码:
u8
以字节为单位拆分usize的函数是splitToVector,它返回u8的向量,因为在运行时无法定义数组的长度(如Shepmaster提供的这篇文章中所定义的那样:How to set a Rust array length dynamically)