2016-03-27 17 views
0

için döküm Bir dosyadan okunan bir Vec<u8> baytım var - baytlar bir metin biçimidir (büyük olasılıkla UTF-16 veya başka bir aptal 2 bayt biçimi) ve onu açmak istiyorum UTF-8.V1 <u8> için bir & [u16]

error: mismatched types: 
expected `*const u16`, 
    found `*const core::result::Result<u8, std::io::error::Error>` 
(expected u16, 
    found enum `core::result::Result`) [E0308] 

Ben yapmalı map: nedeniyle take() çağrısına muhtemelen hataları alıyorum çalışmalıdır bu iken

let title: &[u16] = unsafe { std::slice::from_raw_parts(title_data.as_ptr(), title_data.len()) }; 

: Şu

let title = Vec::from_iter(bytes.take(title_length)); 
// Some Vec<u8> to &[u16] magic 
let title = String::from_utf16_lossy(title); 

Bu oldukça kirli kodunu kullanıyorum take yineleyici veya başka bir şey?

+0

Bu çok iyi bir soru olurdu, eksik görünmüyor muydu. ;) –

+0

Bu garip. Bunu yaparken de bana sorun veriyordu. Bir saniye bekle:/ –

+0

Lütfen sorununuzun bir [MCVE] (/ help/mcve) belirtin. Kodunuzun bir satırı, title_data'ya başvurur, ancak bu hiçbir zaman hiçbir yerde tanımlanmamıştır. İdeal olarak, [Rust Oyun Alanı] (https://play.rust-lang.org/) – Shepmaster

cevap

0

İki hata var. İlk olarak, bir u16 bir u8 iki katı yer kaplıyor, çünkü ikinci uzunluk çok büyük, (sanırım, from_raw_parts(..) arasında) senin Result.unwrap() gerekir, bu yüzden Sonunda 2.

+0

'daki hatayı yeniden üreten kodu sağlayın Ne yazık ki sonucu açamıyorum - 'from_raw_parts 'bana bir dilim * veriyor * results: 'error: 'ifşa' adlı bir yöntem bulunamadı '& [core :: result :: Sonuç ]' geçerli kapsamda ' –

+1

Bkz. Tam bir örnek yazmış olmalısın. Ben sadece 'bytes' döndürür 'Seçenek > 's tahmin edebilirsiniz. – llogiq

+0

Yapmıyor. [Bu, std :: iter :: Take' döndürür] (https://doc.rust-lang.org/std/io/struct.Bytes.html#method.take) –

1

bölün gerek ben Yineleyici üzerinden eşleme yapmadan, yinelenen bir yineleyicinin neden sonuçlardan oluşması gerektiği konusunda kafam karışık.

let title_data = Vec::from_iter(bytes.take(title_length).map(|x| x.unwrap())); 
let title: &[u16] = unsafe { 
    std::slice::from_raw_parts(title_data.as_ptr() as *const u16, title_data.len()/2) 
}; 
let title = String::from_utf16_lossy(title); 
+1

çünkü bir IO yineleyicisi ve IO işlemleri yapabilir başarısız. Bir dosya artık okunamayacağından, uygulamanızı panik ile bırakmayı tercih eder misiniz? – llogiq

İlgili konular