C# 如何在结构体里定义一个已知大小的数组?急急!!

如题,或者定义一个未知大小的数组?
再请问一下前辈,怎样将一个已有的数组拷贝到结构体中?如下:
struct Test
{
byte a;
byte b;
byte [ ] c;
}
Test st;
st.c=new byte[50];
byte buf [ 100 ] ;
for(int i=0; i<100; i++)
{
buf [ i ] = i ;
}
// 在这里写代码将buf 里的数组拷贝到st里,
// 如果能实现的话,效果应该如下:
// buf 里的数据是:buf [0]=0、buf [1]=1、buf [2]=2、buf [3]=3、buf [4]=4 、……
// 在拷贝数据之后,结构本st里的成员数据应该如下:
// st.a=0;
// st.b=1;
// st.c[0]=2 、 st.c[1]=3 、 st.c[2]=4 、 st.c[3]=5 、 st.c[4]=6、 st.c[5]=7 、……

请问前辈们,这要怎样写才能做到?请高手们帮帮,小弟觉得这是个技术高深的问题,小弟不懂,望前辈们帮帮忙!!

定义固定大小的结构体
[StructLayout(LayoutKind.Sequential,Size=14,CharSet= CharSet.Ansi,Pack=1)]
struct SerialPackage
{
public UInt32 voltage;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public byte[] datas;
}
前面[]指定了结构体的布局方式和大小,中间部分的[]指定了数组的封送方法和长度

在结构体和数组直接复制数据使用System.Runtime.InteropServices.Marshal.Copy()方法和Marshal.PtrToStructure()方法,中间必须经过一个中转
byte[] datas=new byte[m_iPackSize];
IntPtr structPtr = Marshal.AllocHGlobal(m_iPackSize);
Marshal.Copy(datas,0,structPtr,m_iPackSize);
m_sPackage=(SerialPackage)Marshal.PtrToStructure(structPtr,typeof(SerialPackage));
Marshal.FreeHGlobal(structPtr);
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-12-16
public struct Book
{
public int[] i;
//或者在构造函数里初始化数组,结构体支持构造函数
}
BooK book1;
book1.i =new int[10];
book1.i[0]=10;追问

那怎么获取结构体的长度呢?比如你说的结构体变量 book1的长度,因为里面有一个未知的数组,在对数组实例化前后对比下,结构体的内存长度是否会变化?

追答

长度肯定是变化的,因为c#中的struct和C中的是不一样的,c#中struct是一个对象,结构名是一个相当于指针的东西,你没法判断struct的长度,C的struct是静态的,所有的成员都是确定的,
你为什么要取struct长度,这个看似简单问题其实不简单.....因为包含了不定的数组在里面,要实现你那个copy自己写个方法就是了
public struct stuTest
{
public byte a;
public byte b;
public byte[] c;
}
public stuTest copyByteArray(byte[] byte1)
{
stuTest mystuTest = new stuTest();
int ii = 2;
mystuTest.a = byte1[0];
mystuTest.b = byte1[1];

int jj = byte1.Length - ii;

if (jj > 0)
{
mystuTest.c = new byte[jj];
for (int i = 0; i < jj; i++)
{
mystuTest.c[i] = byte1[i + ii];
}
}
return mystuTest;
}

追问

嗯,你说方法可以,我也想到了,但这只能用于成员少量的情况下的结构体,要是成员变量很多的情况下就不适用了,比如,结构体嵌结构体,一环嵌一环,如果用你所说的方法,那就是代码量与效率的问题了。因为在C语言那边,只需要强制转换一下就可以了,比如在C语言实现你的例子了:
memcpy(&mystuTest, byte1, sizeof(mystuTest));
只要一句就可以了。而C#只能在结构体没有数组时才行,一旦加上数组则就不行,不知道为什么!

追答

唉,看来你的思路还是C的老路, C#是完全面向对象的,你不能用对象来实现啊,非要struct ,对象是可以打包解包的,是可以类型转换的只要有共同的父类,c#里面的struct是没法控制的,用对象来代替struct也可以有成员,也可以嵌套啊,不知道你到底要搞什么东西,你最好用面向对象的思维来考虑....

追问

呵呵。。谢谢你的回答,我自己已经研究出来了,就是刚刚出来的结果的,功能和C语言一样,代码量很少,效率很高!

追答

哦,是个什么样子呢,该我请教了?

本回答被提问者和网友采纳
第2个回答  2012-03-15
struct structName
{
Array[] arr;
}
第3个回答  2012-03-15
typedef struct
{
uint32_t array_name[];
} struct_name;
相似回答