शून्य-प्रतिलिपि बाइट्स के रूप में सही ढंग से आकार की संरचना stdlib
और एक सामान्य कार्य का उपयोग करके किया जा सकता है।
नीचे दिए गए उदाहरण में नामक एक पुन: प्रयोज्य फ़ंक्शन है जो convert_struct
के बजाय है, क्योंकि यह कास्ट और स्लाइस निर्माण को लपेटने के लिए उपयोगिता है।
ध्यान दें कि प्रश्न परिवर्तित करने के बारे में पूछता है, यह उदाहरण केवल पढ़ने के लिए टुकड़ा बनाता है, इसलिए स्मृति की प्रतिलिपि बनाने की आवश्यकता नहीं है।
उसके बारे में यहां काम कर प्रश्न के आधार पर उदाहरण:
unsafe fn any_as_u8_slice<T: Sized>(p: &T) -> &[u8] {
::std::slice::from_raw_parts(
(p as *const T) as *const u8,
::std::mem::size_of::<T>(),
)
}
fn main() {
struct MyStruct {
id: u8,
data: [u8; 1024],
}
let my_struct = MyStruct { id: 0, data: [1; 1024] };
let bytes: &[u8] = unsafe { any_as_u8_slice(&my_struct) };
// tcp_stream.write(bytes);
println!("{:?}", bytes);
}
नोट 1) भले ही 3 पार्टी क्रेट कुछ मामलों में बेहतर हो सकता है, इस तरह के एक आदिम आपरेशन कि करने के लिए अपने उपयोगी है जंग में कैसे करना है पता है।
नोट 2) लेखन के समय (जंग 1.15), const
कार्यों के लिए कोई समर्थन नहीं है। एक बार वहां, एक स्लाइस के बजाय एक निश्चित आकार के सरणी में डालना संभव होगा।
नोट 3)any_as_u8_slice
समारोह unsafe
चिह्नित क्योंकि struct
में किसी भी पैडिंग बाइट्स स्मृति (अपरिभाषित व्यवहार दे रही है) अप्रारंभीकृत किया जा सकता है। यदि इनपुट तर्क सुनिश्चित करने का कोई तरीका था तो केवल structs का उपयोग किया गया था जो #[repr(packed)]
थे, तो यह सुरक्षित हो सकता है।
अन्यथा फ़ंक्शन काफी सुरक्षित है क्योंकि यह बफर ओवर-रन को रोकता है क्योंकि आउटपुट केवल पढ़ने के लिए, बाइट्स की निश्चित संख्या है, और इसका जीवनकाल इनपुट से जुड़ा हुआ है।
यदि आप एक संस्करण चाहते थे जो &mut [u8]
लौटा, तो यह काफी खतरनाक होगा क्योंकि संशोधित आसानी से असंगत/भ्रष्ट डेटा बना सकता है।
यह मेरे मामले में उपयोगी प्रतीत होता है !! उत्तर देने के लिए आपका शुक्रिया! – agatana
यह ध्यान देने योग्य है कि यह प्रत्यक्ष रूपांतरण नहीं है, जबकि एन्कोडिंग/डिकोडिंग एक द्विआधारी प्रारूप का उपयोग करता है, यह केवल उस सामग्री के आधार पर संरचना की स्मृति (जिसे एक अच्छी और बुरी चीज दोनों के रूप में देखा जा सकता है) तक पहुंच नहीं है, यह कुछ रूपांतरण कर रहा है। उदाहरण के लिए बिनकोड भी एंडियन रूपांतरण करता है। – ideasman42