मैं एक लाइब्रेरी लिख रहा हूं जो बाइनरी प्रारूप से/एन्कोड/चीजों को डीकोड करता है। प्रारूप का हिस्सा संख्या है, जो मैं जंग के मूल आदिम प्रकारों का उपयोग कर रहा हूं (जैसे i8
, i64
, f32
आदि)। क्या इन डेटा प्रकारों को बाइनरी में/से परिवर्तित करने का एक आसान, अंतर्निहित तरीका है, यानी f64
/f32
/i64
/आदि कनवर्ट करें। Vec<u8>
में? इसी प्रकार f32
में 4 u8
(Vec<u8>
के कहने में) को परिवर्तित करने का कोई तरीका है?बाइट प्रस्तुतिकरणों को संख्या प्राइमेटिव्स (i32, f64, आदि) कनवर्ट करना
उत्तर
दुर्भाग्यवश, इस समय जंगलों में एक बाइट सरणी से/प्राइमेटिव को पढ़ने/लिखने के लिए कोई सुरक्षित अंतर्निहित समर्थन नहीं है। इसके लिए कई समुदाय पुस्तकालय हैं, हालांकि, 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>()
)
};
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);
}
}
नोट: कृपया सुनिश्चित करें कि दो चर के आकार बिल्कुल बराबर हैं हो सकता है।
अपने लक्ष्य बाइट्स प्रिंट या उन्हें एक str
प्रतिनिधित्व में है, तो बस एक प्रारूप ब्रेस में :b
संकेतन का उपयोग
fn main() {
println!("This is the binary of int {:b}", 4 as i32);
}
यह
This is the binary of int 100
- 1. नहीं i32/f64 फ़ॉलबैक जब पॉव()
- 2. सी # बाइट को बिटरएरे में कनवर्ट करना
- 3. सी # - यूट को बाइट में कनवर्ट करना []
- 4. UIImage को बाइट ऐरे में कनवर्ट करना
- 5. स्ट्रिंग और बाइट [] के साथ JSON को कनवर्ट करना [] GSON
- 6. कनवर्ट करें [] बाइट को सी * char
- 7. बाइट ऐरे को बाइट ऐरे में कनवर्ट करें?
- 8. जावा में कंटेनर के एरे के प्राइमेटिव्स के ऐरे को कनवर्ट करना
- 9. बिटमैप को बाइट सरणी में कनवर्ट करें
- 10. एचटीपीकंटेंट को बाइट में कनवर्ट करें []
- 11. लेखन llvm बाइट कोड
- 12. डेटाहैंडलर को बाइट में परिवर्तित करना []
- 13. जावा में लंबे [64] से बाइट [512] कनवर्ट करना?
- 14. सी #: स्ट्रिंग को एसबीईटी में कनवर्ट करना *
- 15. बाइट सरणी से लाइन पढ़ें (बाइट सरणी को स्ट्रिंग में कनवर्ट नहीं करें)
- 16. पांडा कनवर्ट करना। डेटाफ्रेम को बाइट्स
- 17. स्ट्रिंग को संख्या फ़ील्ड में कनवर्ट करें
- 18. कनवर्ट करना .mov फ़ाइल को .h264 फ़ाइल
- 19. सी # कनवर्ट सिस्टम.आईओ। स्ट्रीम टू बाइट []
- 20. पीडीएफबॉक्स पीडीएफ को छवि बाइट में कनवर्ट करें []
- 21. MySQL को कनवर्ट करना PostgreSQL
- 22. बाइट की सूची # सी को सम्मिलित करना []
- 23. बाइट सरणी को Wav फ़ाइल में कनवर्ट करें
- 24. जावा स्ट्रिंग को बाइट सरणी में कनवर्ट करें
- 25. आरजीबी 8 बाइट कनवर्ट करें [] से बिटमैप
- 26. एक्शनस्क्रिप्ट फ्लेक्स: # रंगों को कनवर्ट करना
- 27. BufferedImage को बाइट में कनवर्ट करें [] बिना I/O
- 28. प्राइमेटिव्स का स्पष्ट प्रारंभ
- 29. असीमित नकारात्मक प्राइमेटिव्स?
- 30. सी # चार को बाइट (हेक्स प्रतिनिधित्व) में कनवर्ट करें
प्रिंट 'एसटीडी का उपयोग करते हुए: : टुकड़ा :: from_raw_parts' कम कोड है और स्थिर भी चिह्नित है। फिर भी, वही कारणों से असुरक्षित! – bluss
@ user139873, ओह, अच्छा, किसी भी तरह से मुझे याद आया कि ऐसा कार्य मौजूद है। मैंने जवाब अपडेट कर लिया है। –
'बाइटऑर्डर' ठीक से हल करता है। जब मैंने कहा "निर्मित" मुझे यह निर्दिष्ट करना चाहिए था कि crates.io से कुछ पर्याप्त होगा। – Rory