C# 如何在结构体里定义一个已知大小的数组?急急!!
如题,或者定义一个未知大小的数组?再请问一下前辈,怎样将一个已有的数组拷贝到结构体中?如下:structTest{bytea;byteb;byte[]c;}Testst;...
如题,或者定义一个未知大小的数组?
再请问一下前辈,怎样将一个已有的数组拷贝到结构体中?如下:
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 、……
请问前辈们,这要怎样写才能做到?请高手们帮帮,小弟觉得这是个技术高深的问题,小弟不懂,望前辈们帮帮忙!! 展开
再请问一下前辈,怎样将一个已有的数组拷贝到结构体中?如下:
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 、……
请问前辈们,这要怎样写才能做到?请高手们帮帮,小弟觉得这是个技术高深的问题,小弟不懂,望前辈们帮帮忙!! 展开
4个回答
展开全部
定义固定大小的结构体
[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);
[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);
展开全部
更多追问追答
追问
那怎么获取结构体的长度呢?比如你说的结构体变量 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;
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
struct structName
{
Array[] arr;
}
{
Array[] arr;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
typedef struct
{
uint32_t array_name[];
} struct_name;
{
uint32_t array_name[];
} struct_name;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询