How to read binary data into a STRUCT?

  • Thread starter Thread starter Michael Van Altena via .NET 247
  • Start date Start date
M

Michael Van Altena via .NET 247

I'm trying to figure out how to read a formatted binary file intoa structure definition in C#. I've tried using the"StructLayout" attribute with both LayoutKind.Explicit andLayoutKind.Sequential options. I can get this to worksuccessfully, but only when I'm NOT dealing with arrays in thestructure definition.

For example: In C, you are able to simply read a binary file intoa 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 theLayoutKind.Sequential option (Pack=8 in my particular problem) -but I can't get this to work with arrays in the structuredefinition in C#).

In C++ another possibility would be to use a UNION definitioninstead of a class to union a structure definition with an arrayof characters (bytes), and then just read in the bytes andaccess the data through the structure. (i.e. this is like theStructLayout attribute with the LayoutKind.Explicit option - butI can't get this to work with arrays in the structure definitionin 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 aformatted structure and/or class. Can someone out there tell mewhat I'm missing?

Thanks,

Michael.
 
Michael,
Did you know that there is a newsgroup
microsoft.public.dotnet.languages.csharp

There is a possibility you get quicker an answer there,

Cor

"Michael Van Altena via .NET 247"

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.
 
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
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.
 
And of course the "buff" byte array has to be filled with the appropriate
data.

--
Regards,
Dennis JD Myrén
Oslo Kodebureau
Dennis Myrén said:
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
message 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.
 
Back
Top