witam :)
Mam taki oto problem, dopiero zaczalem zabawe z C#, uzywam #develop. Otoz mam pliki binarne, niestety pisane jeszcze pod pascalem dosowym [nie przeze mnie] i chcialbym je wczytac. Stworzylem wiec strukture:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Faktura
{
public ushort numer;
public bool wspol;
public Platnik platnik;
}
[StructLayout(LayoutKind.Sequential, Pack=1)]
public unsafe struct Platnik
{
public ushort numer;
public byte dNazwa;
public fixed byte Nazwa[22];
}
generalnei troche wiecej tego jest ale dla uproszczenia wklejam tylko te pola. No i znalazlem po dlugich i ciezkich mozolach funkcje ktora wczytuje dane binarne do struktury:
public class Czytajka
{
public void Czytaj()
{
string nazwa = "MWST172.VAT";
FileStream fs = new FileStream(nazwa,FileMode.Open);
int size = Marshal.SizeOf(typeof(Faktura));
int s1 = sizeof(ushort);
byte[] bufor = new byte[size];
fs.Read(bufor,0,bufor.Length);
IntPtr ip = Marshal.AllocHGlobal(size);
GCHandle gch = GCHandle.Alloc(ip, GCHandleType.Pinned);
Marshal.Copy(bufor, 0, ip, size);
Faktura f = (Faktura)Marshal.PtrToStructure(ip, typeof(Faktura));
gch.Free();
Marshal.FreeHGlobal(ip);
fs.Close();
Console.WriteLine("{0}",f.numer);
Console.WriteLine(f.wspol.ToString());
Console.WriteLine(f.platnik.numer.ToString());
}
}
i do tego w funkcji main:
class Program
{
public static void Main(string[] args)
{
Czytajka c = new Czytajka();
c.Czytaj();
Console.ReadKey(true);
}
}
Problem polega na tym, ze pomimo dania alignment na 1 rozmiar jest odczytywany zle. Co ciekawe, zakomentowalem w strukturze faktura wszystko oprocz public bool i rozmiar owego boola wyniosl 4 bajty :-/ . Czy ktos napotkal moze na podobny problem albo wie jak mozna prosciej wczytac te dane binarne? :)
pozdrawiam, Mateusz