2017-04-16 81 views
1

如何創建一個空的[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

讀取錯誤信息將幫助您更; 不匹配類型,類型可變性不同,預期類型&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文檔是正確的行爲。

+0

非常全面的答案,謝謝! – Anton

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);