Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用结构数组和大小参数索引封送C#结构_C#_Struct_Tcp_Marshalling_Packet - Fatal编程技术网

使用结构数组和大小参数索引封送C#结构

使用结构数组和大小参数索引封送C#结构,c#,struct,tcp,marshalling,packet,C#,Struct,Tcp,Marshalling,Packet,我已经阅读了几个主题,但我仍然无法理解无法轻松将此结构转换为字节数组的真正限制: [StructLayout(LayoutKind.Sequential, Pack = 1)] struct B { public int b_a; } [StructLayout(LayoutKind.Sequential, Pack = 1)] struct A { public int sizeB; [MarshalAs(UnmanagedType.LPArray, SizeParamInde

我已经阅读了几个主题,但我仍然无法理解无法轻松将此结构转换为字节数组的真正限制:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct B {
  public int b_a;
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct A {
  public int sizeB;

  [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)]
  public B[] b;
}
我正在编写一个TCP通信程序,所以我想在一个结构中构建我的S2C数据包,然后将它们作为byte[]发送,所以我正在寻找最便宜、最快的方法来实现这一点

我已经在很多方面尝试过Marsheling,但是在Marshal.SizeOf()中总是存在一些异常

在本例中,我得到以下错误:“[…]无法作为非托管结构封送;无法计算有意义的大小或偏移量。”

结构初始化,例如:

A a = new A();
B[] b = new B[5];

a.sizeB = 5;
a.b = b;

Marshal.SizeOf(a);

<>对于低级内存访问,您没有与C或C++相同的控件。如果在C#中有一个未定义长度的数组,则需要执行一些手动操作

以下是实现这一目标的几种方法

struct B
{
    public int b_a;
}

struct A
{
    public int sizeB;

    public B[] b;
}
第一个是二进制编写器。如果您的结构没有太多的字段,这可能会更快

static byte[] ConvertToByte(A a)
{
    using (var ms = new MemoryStream())
    using (var writer = new BinaryWriter(ms))
    {
        writer.Write(a.sizeB);

        foreach (var b in a.b)
            writer.Write(b.b_a);

        return ms.ToArray();
    }
}
另一种方法是像您一样使用编组,但显式地在数组中循环

static byte[] ConvertToByte(A a)
{
    var bStructSize = Marshal.SizeOf<B>();
    var size = bStructSize * a.b.Length;

    var arr = new byte[size + 4];

    var ptr = Marshal.AllocHGlobal(size);

    for (int i = 0; i < a.b.Length; i++)
        Marshal.StructureToPtr(a.b[i], ptr + i * bStructSize, true);

    Marshal.Copy(ptr, arr, 4, size);

    Array.Copy(BitConverter.GetBytes(a.sizeB), arr, 4);

    return arr;
}
静态字节[]转换为字节(A)
{
var bStructSize=Marshal.SizeOf();
变量大小=b结构大小*a.b.长度;
var arr=新字节[size+4];
var ptr=Marshal.AllocHGlobal(大小);
for(int i=0;i
我假设您正在尝试调用
Marshall.SizeOf(a)
,除非您的数组是固定长度的。@Jerry是的,它不是,也不能是固定长度的