Re: How to read binary data into a STRUCT?

Tech Tip: Click here to run a free scan for Windows Errors and optimize PC performance

From: Dennis Myrén (dennis_at_oslokb.no)
Date: 09/20/04


Date: Mon, 20 Sep 2004 11:10:12 +0200

byte [] buff = new byte [Marshal.SizeOf(STRUCT)];
IntPtr ptr = Marshal.AllocHGlobal(buff.Length);
Marshal.Copy(buff, 0x0, ptr, buff.Length);
STRUCT result = (STRUCT) Marshal.PtrToStructure(ptr, typeof(STRUCT));
Marshal.FreeHGlobal(ptr);

[ StructLayout( LayoutKind.Sequential, Pack = 0x1 ) ]
struct STRUCT
{
 public ushort field1;
 [ MarshalAs( UnmanagedType.ByValArray, SizeConst = 0x3C ) ]
 public byte [] field2;
 ...
}

-- 
Regards,
Dennis JD Myrén
Oslo Kodebureau
"Michael Van Altena via .NET 247" <anonymous@dotnet247.com> wrote in message 
news:OWJ957rnEHA.3428@TK2MSFTNGP11.phx.gbl...
I'm trying to figure out how to read a formatted binary file into a 
structure definition in C#. I've tried using the "StructLayout" attribute 
with both LayoutKind.Explicit and LayoutKind.Sequential options.  I can get 
this to work successfully, but only when I'm NOT dealing with arrays in the 
structure definition.
For example: In C, you are able to simply read a binary file into a 
structure as follows:
---------------------------------------------------------------------------------------------------------
/* The structure definition */
typedef struct
{
  short anShorts[5];
  char strString[32];
  double adDoubles[10];
} FORMATDEF;
/* Open the file */
FILE * pFile;
pFile = fopen("Test.bin", "rb");
/* Read into the structure */
FORMATDEF structFormatDef;
fread(pFile, &structFormatDef, sizeof(FORMATDEF));
/* Close the file */
fclose(pFile);
---------------------------------------------------------------------------------------------------------
Note: The above example is using arrays in the STRUCT definition. This is 
the main root of the problem I am trying to solve. (i.e. this is like the 
StructLayout attribute with the LayoutKind.Sequential option (Pack=8 in my 
particular problem) - but I can't get this to work with arrays in the 
structure definition in C#).
In C++ another possibility would be to use a UNION definition instead of a 
class to union a structure definition with an array of characters (bytes), 
and then just read in the bytes and access the data through the structure. 
(i.e. this is like the StructLayout attribute with the LayoutKind.Explicit 
option - but I can't get this to work with arrays in the structure 
definition in C#).
I can't believe with all the great features that C# has to offer, that there 
isn't a simple way to read in a binary file into a formatted structure 
and/or class.  Can someone out there tell me what I'm missing?
Thanks,
Michael.
--------------------------------
From: Michael Van Altena
-----------------------
Posted by a user from .NET 247 (http://www.dotnet247.com/)
<Id>7dFE/rBp9kufEMK5ukIchQ==</Id> 


Relevant Pages

  • Re: How to read binary data into a STRUCT?
    ... Dennis JD Myrén ... > I'm trying to figure out how to read a formatted binary file into a ... > in the structure definition. ... The above example is using arrays in the STRUCT definition. ...
    (microsoft.public.dotnet.general)
  • Re: How to read binary data into a STRUCT?
    ... I'm trying to figure out how to read a formatted binary file into a ... structure definition in C#. I've tried using the "StructLayout" attribute ... FORMATDEF structFormatDef; ... The above example is using arrays in the STRUCT definition. ...
    (microsoft.public.dotnet.general)
  • How to read binary data into a STRUCT?
    ... /* The structure definition */ ... FORMATDEF structFormatDef; ... I can't believe with all the great features that C# has to offer, that there isn't a simple way to read in a binary file into a formatted structure and/or class. ...
    (microsoft.public.dotnet.general)
  • Arrays of structures that contain an array - is it even possible??
    ... the structure definition includes one or more arrays? ... Structure MyUDT ... I can no longer have this sort of UDT array in VB.net (I'm sure I ...
    (microsoft.public.dotnet.languages.vb)