【问题标题】:Conversion of class instance to raw byte array in C#在 C# 中将类实例转换为原始字节数组
【发布时间】:2020-05-29 15:32:04
【问题描述】:

我正在使用 C# 制作人机界面应用程序,其中需要在应用程序和基于 STM32 的机器人控制器之间设置串行端口通信。 但由于该控制器是基于 C++ 的,我需要将通信对象转换为字节数组,然后将其发送出去。 我尝试了类序列化但不起作用,因为它会生成更大的数据(445 字节)数组并且变量的位置不匹配,因此 c++ 代码无法正确解析它。

这是我需要发送给机器人的课程:

    [Serializable]
    public class RobotData
    {
        public RobotData(Byte _axisCount)
        {
            axisCount = _axisCount;
            axData = new AxisData[axisCount];

            for (int i = 0; i < axisCount; i++)
            {
                axData[i] = new AxisData((Byte)i);
            }

        }

        public Int16 messageType;
        public Byte axisCount;
        public Int32 statusDWord;
        public AxisData[] axData;

    }

这是内部类的定义:

    public class AxisData
    {
        public AxisData(Byte _axisId)
        {
            axisId = _axisId;
        }

        public Byte axisId;
        public Int32 position;
        public float velocity ;
        public float acceleration;
        public float torque;

    }

所以我正在尝试创建一个字节数组,它会像这样:

- 位置/变量

  • 0 / 消息类型
  • 2 / 轴数
  • 3 / statusDWord
  • 7 / axData[0].axisId
  • 8 / axData[0].position
  • ...
  • 54 / axData[2].torque

(总大小为 58 字节)

是否有某种通用方法(适用于任何类)来创建这个纯原始数据数组? 以及如何将传入的数据字节构造成类似的类? 谢谢。

【问题讨论】:

    标签: c# arrays object serialization byte


    【解决方案1】:

    您可以做其他花哨的事情,不过为什么不自己用BinaryWriter.Write 重载来控制序列化

    public class RobotData
    {
       ...
    
       public byte[] ToArray()
       {
          using (var ms = new MemoryStream())
             using (var sw = new BinaryWriter(ms))
             {
                sw.Write(messageType);
                sw.Write(axisCount);
                sw.Write(statusDWord);
    
                foreach (var data in axData)
                {
                   sw.Write(data.axisId);
                   sw.Write(data.position);
                   ...
                }
    
                return ms.ToArray();
             }
       }
    }
    

    【讨论】:

    • 有没有类似的方法将字节数组反序列化成对象?
    • @BranislavBaran 是的,基本上是相反的。查看BinaryReader 方法。它为您提供一切
    • 是的,效果也很好。谢谢朋友!我很高兴终于让它工作了。
    猜你喜欢
    • 2021-05-05
    • 2012-07-14
    • 2014-12-19
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2013-11-10
    相关资源
    最近更新 更多