C# 结构体转byte数组,byte数组不是固定大小,无法用Marshal

梦里流沙 2020-01-09 10:35:29
和C++的代码进行socket通信,传送的数据大小是不固定的,所以没有办法用Marshal来做转换。
bitconvert 结构体太多,数据量太大没办法转换。请教大神怎么做。

public struct DemoParametersFrame,
{
public int CMD_ID;
public int Total_Size;
public int Param_ID;
public int Param_Size;
public byte[] Param_Data; //非固定长度,
};
...全文
277 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
泡泡龙 2020-01-12
  • 打赏
  • 举报
回复
二进制序列化。或者xml,json序列化,再转成byte[]呗
github_36000833 2020-01-10
  • 打赏
  • 举报
回复
也可以不用Marshal的。下例是发送了例子,接收可以自己写,比如用BinaryReader。

public struct DemoParametersFrame
{
    public int CMD_ID;
    public int Total_Size;
    public int Param_ID;
    public int Param_Size;
    public byte[] Param_Data; //非固定长度,

    public void WriteToStream(Stream stream)
    {
        if (Param_Size < 0 || Param_Size > (Param_Data?.Length ?? 0)) throw new InvalidOperationException();
        if (Total_Size != 4 * sizeof(int) + Param_Size) throw new InvalidOperationException();

        using (var writer = new BinaryWriter(stream, Encoding.UTF8, leaveOpen: true))
        {
            writer.Write(CMD_ID);
            writer.Write(Total_Size);
            writer.Write(Param_ID);
            writer.Write(Param_Size);
            if (Param_Data != null) writer.Write(Param_Data, 0, Param_Size);
        }
    }
}
it_gz_xi 2020-01-10
  • 打赏
  • 举报
回复
不要一次发完啊,分包发送
梦里流沙 2020-01-10
  • 打赏
  • 举报
回复
引用 2 楼 github_36000833 的回复:
也可以不用Marshal的。下例是发送了例子,接收可以自己写,比如用BinaryReader。

public struct DemoParametersFrame
{
    public int CMD_ID;
    public int Total_Size;
    public int Param_ID;
    public int Param_Size;
    public byte[] Param_Data; //非固定长度,

    public void WriteToStream(Stream stream)
    {
        if (Param_Size < 0 || Param_Size > (Param_Data?.Length ?? 0)) throw new InvalidOperationException();
        if (Total_Size != 4 * sizeof(int) + Param_Size) throw new InvalidOperationException();

        using (var writer = new BinaryWriter(stream, Encoding.UTF8, leaveOpen: true))
        {
            writer.Write(CMD_ID);
            writer.Write(Total_Size);
            writer.Write(Param_ID);
            writer.Write(Param_Size);
            if (Param_Data != null) writer.Write(Param_Data, 0, Param_Size);
        }
    }
}
这是将结构体拆包了,其实我的byte数组就是要从很多结构体过来的。所以问题的根源是我要找到一种办法可以将我很多结构体转成byte数组的方法。

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧