如何创建空字节数组?

时间:2017-04-16 17:07:43

标签: rust

如何创建一个空的[u8]然后我可以传递给openssl函数,以便将结果写入它?

fn test_encrypt(key_pair: openssl::rsa::Rsa) {
    let text = b"Hello";
    println!("{:?}", text);
    let mut result = b" ";
    let pad = openssl::rsa::Padding::from_raw(1);
    key_pair.private_encrypt(text, result, pad);
}

我的代码目前导致以下错误:

error[E0308]: mismatched types
  --> src/main.rs:20:36
   |
20 |     key_pair.private_encrypt(text, result, pad);
   |                                    ^^^^^^ types differ in mutability
   |
   = note: expected type `&mut [u8]`
              found type `&[u8; 0]`

2 个答案:

答案 0 :(得分:3)

阅读错误消息将对您有所帮助; 不匹配类型类型的可变性预期类型&mut [u8],找到类型&[u8; 0] 。您的问题不在于如何创建阵列,而是您不能创建正确的阵列类型。

Printing the type of the variable会显示b" "为数组创建&[u8; 1] - 不可变引用。您尝试的内容并不重要,您无法写入此数据。实际上,它存储在已编译的可执行文件中的静态数据中。

相反,你需要一些可以用作可变片的东西。两种主要方法是创建实际数组或Vec

// Array
let mut result = [0; 24];
key_pair.private_encrypt(text, &mut result, pad);

// Vec
let mut result = vec![0; 24];
key_pair.private_encrypt(text, &mut result, pad);

数组是堆栈分配的,并且具有必须相等的固定大小和容量。向量是堆分配的,具有可能彼此不同的动态大小和容量。

这两个都可以取消引用&mut [u8]

为数组或向量选择合适的大小是特定于应用程序的。检查OpenSSL文档是正确的做法。

答案 1 :(得分:2)

private_encrypt()方法需要一个足够长的缓冲区(key_pair.size()字节)的可变片段。变化

let mut result = b" ";
key_pair.private_encrypt(text, result, pad);

let mut result = vec![0; key_pair.size()];
key_pair.private_encrypt(text, &mut result, pad);