मैं है निम्नलिखित संरचनाMarshal.SizeOf संरचना, अत्यधिक संख्या
[StructLayout(LayoutKind.Sequential)]
public struct SFHeader
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
public string FileName;
public int Offset;
public short Size;
public byte Flags;
public byte Source;
public long LastWriteTime;
public byte[] GetBytes()
{
int size = Marshal.SizeOf(this);
var buffer = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(this, ptr, true);
Marshal.Copy(ptr, buffer, 0, size);
Marshal.FreeHGlobal(ptr);
return buffer;
}
public static SFHeader FromBytes(byte[] buffer)
{
var str = new SFHeader();
int size = Marshal.SizeOf(str);
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(buffer, 0, ptr, size);
str = (SFHeader)Marshal.PtrToStructure(ptr, str.GetType());
Marshal.FreeHGlobal(ptr);
return str;
}
}
मैं (सॉकेट के साथ पैकेट के रूप में भेजने के लिए) बाइट की एक सरणी के लिए अपने संरचना बदलने की आवश्यकता है, इसलिए मैं GetBytes
विधि का उपयोग देता है लेकिन
- फ़ाइल का नाम (स्ट्रिंग): यह
24
बाइट्स की एक सरणी के बजाय21
बाइट्स की एक सरणी देता है 5 बाइट्स - ऑफसेट (int): 4 बाइट्स +०१२३५१६४१०६
- आकार (संक्षिप्त): 2 बाइट्स
- झंडे (बाइट): 1 बाइट
- स्रोत (बाइट): 1 बाइट
- LastWriteTime (लंबी): 8 बाइट्स
तो: 5 4 + 2 + 1 + 1 + 8 = 21 बाइट्स।
ऐसा इसलिए होता है क्योंकि Marshal.SizeOf
24 लौटाता है, क्यों? और ऐसा लगता है कि अधिक में बाइट्स उदाहरण के लिए, स्ट्रिंग के बाइट्स के बाद रखा जाता है वास्तव में निम्नलिखित संरचना:
var header = new SFHeader()
{
FileName = "aaaa",
Offset = 1,
Size = 1
};
निम्नलिखित बफर में बदल जाती है:
[0] = 97
[1] = 97
[2] = 97
[3] = 97
[4] = 0
[5] = 0
[6] = 0
[7] = 0
[8] = 1
[9] = 0
[10] = 0
[11] = 0
[12] = 1
[13] = 0
... The following are all zero (0)
पांचवें , छठे और सातवें बाइट्स अतिरिक्त हैं। मैं इस समस्या को कैसे हल कर सकता हूं?
स्ट्रिंग की अजीब लंबाई है, इसलिए अन्य फ़ील्ड को वास्तविकता मिली है। स्पष्ट लेआउट का उपयोग करके इसे ठीक किया जा सकता है। "अनुक्रमिक" का मतलब "संगत" नहीं है। – harold
क्या स्ट्रिंग हमेशा एक ही लंबाई है? – SynerCoder
@ सिनरकोडर हां, अधिकतम 5 बाइट्स। – Nick