2015-04-04 4 views
9

मैं एक लाइब्रेरी लिख रहा हूं जो बाइनरी प्रारूप से/एन्कोड/चीजों को डीकोड करता है। प्रारूप का हिस्सा संख्या है, जो मैं जंग के मूल आदिम प्रकारों का उपयोग कर रहा हूं (जैसे i8, i64, f32 आदि)। क्या इन डेटा प्रकारों को बाइनरी में/से परिवर्तित करने का एक आसान, अंतर्निहित तरीका है, यानी f64/f32/i64/आदि कनवर्ट करें। Vec<u8> में? इसी प्रकार f32 में 4 u8 (Vec<u8> के कहने में) को परिवर्तित करने का कोई तरीका है?बाइट प्रस्तुतिकरणों को संख्या प्राइमेटिव्स (i32, f64, आदि) कनवर्ट करना

उत्तर

9

दुर्भाग्यवश, इस समय जंगलों में एक बाइट सरणी से/प्राइमेटिव को पढ़ने/लिखने के लिए कोई सुरक्षित अंतर्निहित समर्थन नहीं है। इसके लिए कई समुदाय पुस्तकालय हैं, हालांकि, byteorder सबसे अधिक उपयोग किए जाने वाले हैं। मेरा सुझाव है कि आप इसे आज़माएं।

बेशक, आप हमेशा कच्चे पॉइंटर्स डाल सकते हैं, उदाहरण के लिए, आप *const i64 को *const i8 में बदल सकते हैं और फिर इसे उचित बाइट स्लाइस &[u8] में परिवर्तित कर सकते हैं। बहरहाल, यह गलत करने के लिए आसान है, unsafe और मंच पर निर्भर है, इसलिए यह एक अंतिम उपाय के रूप में इस्तेमाल किया जाना चाहिए:

use std::mem; 
use std::slice; 

let i: i64 = 12345; 
let ip: *const i64 = &x; 
let bp: *const u8 = ip as *const _; 
let bs: &[u8] = unsafe { 
    slice::from_raw_parts(
     bp, 
     mem::size_of::<i64>() 
    ) 
}; 
+2

प्रिंट 'एसटीडी का उपयोग करते हुए: : टुकड़ा :: from_raw_parts' कम कोड है और स्थिर भी चिह्नित है। फिर भी, वही कारणों से असुरक्षित! – bluss

+0

@ user139873, ओह, अच्छा, किसी भी तरह से मुझे याद आया कि ऐसा कार्य मौजूद है। मैंने जवाब अपडेट कर लिया है। –

+2

'बाइटऑर्डर' ठीक से हल करता है। जब मैंने कहा "निर्मित" मुझे यह निर्दिष्ट करना चाहिए था कि crates.io से कुछ पर्याप्त होगा। – Rory

9

std::mem::transmute अब स्थिर है, हालांकि यह unsafe है। हम कुछ इस तरह कर सकते हैं:

fn main() { 
    let var1 = 12345678_i64; 
    let raw_bytes : [i8; 8] = unsafe {std::mem::transmute(var1)}; 
    for byte in &raw_bytes { 
     println!("{}", byte); 
    } 
} 

नोट: कृपया सुनिश्चित करें कि दो चर के आकार बिल्कुल बराबर हैं हो सकता है।

0

अपने लक्ष्य बाइट्स प्रिंट या उन्हें एक str प्रतिनिधित्व में है, तो बस एक प्रारूप ब्रेस में :b संकेतन का उपयोग

fn main() { 
    println!("This is the binary of int {:b}", 4 as i32); 
} 

यह

This is the binary of int 100

संबंधित मुद्दे