I'm struggling with a C# program to read binary records from a database. The records were created with Borland Delphi. Here's an example:
// Delphi record definition tBowler_Rec = Record public gender : tGender; bowler_num : byte; name : tString32; initials : String[3]; ...
// Corresponding C# definition (unmanaged code) [StructLayout(LayoutKind.Sequential, Pack=4)] public unsafe struct tBowler_Rec { public tGender gender; public byte bowler_num; public fixed byte name[32]; public fixed byte initials[3]; ...
I'm actually able to read this binary struct out of a SQL Server database and see the data in the Visual Studio debugger. Yay! I'm able to access fields like "gender" and "bowler_num" with no problem. Yay!
Q: How do I turn "name" into a C# string?
An example name is "ASHTON". It looks like this in memory:
\0x6ASHTON\0x0\0x0...
Here's how I'm trying to access it:
[StructLayout(LayoutKind.Sequential, Pack=4)]
public unsafe struct tBowler_Rec
{
public tGender gender;
public byte bowler_num;
public fixed byte name[32];
...
public string Name
{
get
{
StringBuilder sb = new StringBuilder();
int ilen = name[0];
for (int i = 1; i <= ilen; i++)
sb.Append(name[i]);
return sb.ToString();
}
}
I'm getting this error:
Error: You cannot use fixed size buffers contained in unfixed expressions. Try using the fixed statement.
Help?????
Thank you in advance!
unsafe
andfixed
? I don't see why you would need to do that. It looks like a pretty routine P/Invoke to me. – David Heffernanstring[N]
instances between Delphi and C#? – David Heffernan\0x6ASHTON\0x0\0x0
clearly is good ol' Turbo Pascal string where length byte prepends up to 255 character bytes. – Premature Optimization