Преобразование списка структур в байтовый массив - PullRequest
0 голосов
/ 02 ноября 2010

У меня есть список структур, каждая структура имеет два коротких значения и байтовое значение.Я хотел бы написать это в HEX-файл, содержащий только необработанные данные.Это значение HEX будет загружено в микроконтроллер.

Может кто-нибудь указать мне правильное направление, как вывести эти значения в файл .?

Ответы [ 3 ]

1 голос
/ 02 ноября 2010

Допустим, ваша структура

struct Package {
    public short First { get; private set; }
    public short Second { get; private set; }
    public byte Third { get; private set; }
    public Package(short first, short second, byte third) : this() {
        this.First = first;
        this.Second = second; 
        this.Third = third;
    }
}

Тогда:

void WritePackageOnWriter(Package package, BinaryWriter binaryWriter) {
    binaryWriter.Write(package.First);
    binaryWriter.Write(package.Second);
    binaryWriter.Write(package.Third);
}

Так что

// binaryWriter is BinaryWriter
// packages is IEnumerable<Package>
foreach(var package in packages) {
    WritePackageOnWriter(package, binaryWriter);
}

При необходимости вы можете восстановить с помощью

Package ReadPackageFromReader(BinaryReader binaryReader) {
    short first = binaryReader.ReadInt16();
    short second = binaryReader.ReadInt16();
    byte third = binaryReader.ReadByte();
    return new Package(first, second, third);
}
1 голос
/ 02 ноября 2010

Я предполагаю, что под шестнадцатеричным файлом вы на самом деле подразумеваете двоичный файл, а не текстовый файл с шестнадцатеричными кодами.

В структуре будет заполнение, поэтому вы не можете просто вывести список прямо вфайл.

Просто получите значения из каждой структуры и запишите в файл, используя BinaryWriter:

using (FileStream file = File.OpenWrite("FileName.ext")) {
  using (BinaryWriter writer = new BinaryWriter(file)) {
    foreach (Data data in theList) {
      writer.Write(data.FirstShort);
      writer.Write(data.SecondShort);
      writer.Write(data.TheByte);
    }
  }
}
0 голосов
/ 03 ноября 2010

Посмотрите на этот сайт: http://www.developerfusion.com/article/84519/mastering-structs-in-c/

Я думаю, вам понадобится больше контроля над вашими типами данных, особенно с сериализацией / десериализацией ваших данных.Это позволит вам ТОЧНО контролировать, как вы распределяете типы данных.

, взятые непосредственно из Мастеринг структур в C #

Структура макета

[StructLayout(LayoutKind.Sequential,
Pack = 1, CharSet = CharSet.Unicode)]
public struct DISPLAY_DEVICE
{
    public int cb;
    [MarshalAs(
        UnmanagedType.ByValArray,
        SizeConst=32)]
        public char[] DeviceName;
    [MarshalAs(
        UnmanagedType.ByValArray,
        SizeConst=128)]
        public char[] DeviceString;
    public int StateFlags;
    [MarshalAs(
        UnmanagedType.ByValArray,
        SizeConst = 128)]
        public char[] DeviceID;
    [MarshalAs(
        UnmanagedType.ByValArray,
        SizeConst = 128)]
        public char[] DeviceKey;
}

Сериализация

public static byte[]
    RawSerialize(object anything)
{
    int rawsize =
        Marshal.SizeOf(anything);
    IntPtr buffer =
        Marshal.AllocHGlobal(rawsize);
    Marshal.StructureToPtr(anything,
        buffer, false);
    byte[] rawdata = new byte[rawsize];
    Marshal.Copy(buffer, rawdata,
        0, rawsize);
    Marshal.FreeHGlobal(buffer);
    return rawdata;
}

Примечание:

Для базовой сериализации я не буду пытаться свернуть свою собственную, я просто использую встроенную сериализацию .NET: http://msdn.microsoft.com/en-us/library/4abbf6k0.aspx

...