मैं सी # का उपयोग कर बाइनरी डेटा पढ़ने की कोशिश कर रहा हूं। मेरे पास उन फ़ाइलों में डेटा के लेआउट के बारे में सारी जानकारी है जिन्हें मैं पढ़ना चाहता हूं। मैं डेटा को "खंड द्वारा खंडित" पढ़ने में सक्षम हूं, यानी डेटा के पहले 40 बाइट्स को इसे स्ट्रिंग में परिवर्तित करने में सक्षम हूं, अगले 40 बाइट प्राप्त करें।
चूंकि डेटा के कम से कम तीन थोड़ा अलग संस्करण हैं, इसलिए मैं सीधे डेटा को डेटा में पढ़ना चाहता हूं। यह "रेखा से लाइन" पढ़ने से बस इतना अधिक सही लगता है।
मैंने निम्न दृष्टिकोण का प्रयास किया है लेकिन इसका कोई फायदा नहीं हुआ:
StructType aStruct;
int count = Marshal.SizeOf(typeof(StructType));
byte[] readBuffer = new byte[count];
BinaryReader reader = new BinaryReader(stream);
readBuffer = reader.ReadBytes(count);
GCHandle handle = GCHandle.Alloc(readBuffer, GCHandleType.Pinned);
aStruct = (StructType) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(StructType));
handle.Free();
स्ट्रीम एक खोला गया फ़ाइलस्ट्रीम है जिसमें से मैंने पढ़ना शुरू कर दिया है। Marshal.PtrToStructure
का उपयोग करते समय मुझे AccessViolationExceptio
n मिलता है।
स्ट्रीम में पढ़ने की कोशिश करने की तुलना में स्ट्रीम में अधिक जानकारी होती है क्योंकि मुझे फ़ाइल के अंत में डेटा में दिलचस्पी नहीं है।
संरचना को इस प्रकार परिभाषित किया गया है:
[StructLayout(LayoutKind.Explicit)]
struct StructType
{
[FieldOffset(0)]
public string FileDate;
[FieldOffset(8)]
public string FileTime;
[FieldOffset(16)]
public int Id1;
[FieldOffset(20)]
public string Id2;
}
इस सवाल को कम करने के लिए उदाहरण कोड मूल से बदल दिया गया है।
मैं फ़ाइल से एक संरचना में बाइनरी डेटा कैसे पढ़ूं?