единичный байтовый массив c # для структуры содержит массив данных - PullRequest
0 голосов
/ 12 сентября 2018

Я хочу преобразовать байтовый массив (размер 38) в эту структуру.

когда я редактирую код public byte [] arrayAxis; этот код работает очень настенно.

пожалуйста, помогите ... спасибо!

[System.Serializable]
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SInfo
{
    public byte STX;
    public short Length;
    public short ID;
    public byte CMD;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
    public float[] arrAxis;
    //public float AxisX;
    //public float AxisY;
    //public float AxisZ;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
    public float[] arrQuat;
    //public float QuaternionX;
    //public float QuaternionY;
    //public float QuaternionZ;
    //public float QuaternionW;

    public byte State;
    public short State2;

    public byte CRC;
}

Я написал и использовал эту функцию.

public T FromByteArray<T>(byte[] _array)
{
    BinaryReader _reader = new BinaryReader(new MemoryStream(_array));

    GCHandle handle = GCHandle.Alloc(_array, GCHandleType.Pinned);
    T theStructure = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
    handle.Free();

    return theStructure;
}

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

SizeConst Указывает количество элементов в массиве фиксированной длины или количество символов (не байтов) в строке для импорта.

Итак, вы, вероятно, хотели установитьэто 3 и 4 вместо 12 и 16 соответственно - тогда размер этой структуры будет 38 байтов.

0 голосов
/ 12 сентября 2018

Размер структуры составляет 122 байта, потому что число с плавающей запятой составляет 4 байта.Таким образом, arrAxis = 4 x 12 и arrQuat = 4 x 16. Проверяется приведенный ниже код.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Runtime.InteropServices;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            SInfo s = new SInfo();
            IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(s));
            Marshal.StructureToPtr(s, ptr, true);
            byte[] buffer = new byte[Marshal.SizeOf(s)];
            Marshal.Copy(ptr, buffer, 0, Marshal.SizeOf(s));

            Test test = new Test();
            SInfo sinto = test.FromByteArray<SInfo>(buffer);


        }
    }
    public class Test
    {
        public T FromByteArray<T>(byte[] _array)
        {
            BinaryReader _reader = new BinaryReader(new MemoryStream(_array));

            GCHandle handle = GCHandle.Alloc(_array, GCHandleType.Pinned);
            T theStructure = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
            handle.Free();

            return theStructure;
        }
    }

    [System.Serializable]
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct SInfo
    {
        public byte STX;
        public short Length;
        public short ID;
        public byte CMD;

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
        public float[] arrAxis;
        //public float AxisX;
        //public float AxisY;
        //public float AxisZ;

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
        public float[] arrQuat;
        //public float QuaternionX;
        //public float QuaternionY;
        //public float QuaternionZ;
        //public float QuaternionW;

        public byte State;
        public short State2;

        public byte CRC;
    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...