以下是我的结构体 public struct Iridium_MessageInfo
{
private byte start; //包头字 0xd7
private byte messageType; //报文类型
private UInt16 no; //报文编号
private UInt16 check; //报文验证码
private UInt16 len; //报文长度
private byte[] messageData; //报文数据 public byte Start { get { return start; } set { start = value; } }
public Interpret.messagetype MessageType { get { return (Interpret.messagetype)messageType; } set { messageType = (byte)value; } }
public UInt16 No { get { return no; } set { no = value; } }
public UInt16 Check { get { return check; } set { check = value; } }
public UInt16 Len { get { return len; } set { len = value; } }
public byte[] MessageData { get { return messageData; } set { messageData = value; } } public Iridium_MessageInfo(byte Start, Interpret.messagetype MessageType, UInt16 No, UInt16 Check, UInt16 Len, byte[] MessageData)
{ this.start = Start;
this.messageType = (byte)MessageType;
this.no = No;
this.check = Check;
this.len = Len;
this.messageData = MessageData;
}
}我在程序中是这样调用的 private byte[] test(object structObj)
{
//得到结构体的大小
int size = Marshal.SizeOf(structObj);
//创建byte数组
byte[] bytes = new byte[size];
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将结构体拷到分配好的内存空间
Marshal.StructureToPtr(structObj, structPtr, false);
//从内存空间拷到byte数组
Marshal.Copy(structPtr, bytes, 0, size);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回byte数组
return bytes;
}
private void demo()
{
Iridium_MessageInfo mess = new Iridium_MessageInfo(0xd7, 0xa5, 1, 23, 12, new byte[]{0x01,0x02,0x03,0x04});
byte[] b = this.test(mess);
// 将数据发送出去
}
通过 Iridium_MessageInfo mess 初始化结构体 。 然后通过 test() 方法将结构体转换成 BYTE[]
功能是成功的。 但是
Iridium_MessageInfo mess = new Iridium_MessageInfo(0xd7, messagetype.IRIDIUM_MESSAGE_TYPE_LINK, 1, 23, 12, new byte[]{0x01,0x02,0x03,0x04});
最后一个参数 new byte[]{0x01,0x02,0x03,0x04} 却有些混乱了 每次得到的都不一样 ,而且不是原来的数据 1 2 3 4
,前面的数据都是对的。这个是什么原因造成的呢? 只有转换byte[]的时候才出现这个错误。
{
private byte start; //包头字 0xd7
private byte messageType; //报文类型
private UInt16 no; //报文编号
private UInt16 check; //报文验证码
private UInt16 len; //报文长度
private byte[] messageData; //报文数据 public byte Start { get { return start; } set { start = value; } }
public Interpret.messagetype MessageType { get { return (Interpret.messagetype)messageType; } set { messageType = (byte)value; } }
public UInt16 No { get { return no; } set { no = value; } }
public UInt16 Check { get { return check; } set { check = value; } }
public UInt16 Len { get { return len; } set { len = value; } }
public byte[] MessageData { get { return messageData; } set { messageData = value; } } public Iridium_MessageInfo(byte Start, Interpret.messagetype MessageType, UInt16 No, UInt16 Check, UInt16 Len, byte[] MessageData)
{ this.start = Start;
this.messageType = (byte)MessageType;
this.no = No;
this.check = Check;
this.len = Len;
this.messageData = MessageData;
}
}我在程序中是这样调用的 private byte[] test(object structObj)
{
//得到结构体的大小
int size = Marshal.SizeOf(structObj);
//创建byte数组
byte[] bytes = new byte[size];
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将结构体拷到分配好的内存空间
Marshal.StructureToPtr(structObj, structPtr, false);
//从内存空间拷到byte数组
Marshal.Copy(structPtr, bytes, 0, size);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回byte数组
return bytes;
}
private void demo()
{
Iridium_MessageInfo mess = new Iridium_MessageInfo(0xd7, 0xa5, 1, 23, 12, new byte[]{0x01,0x02,0x03,0x04});
byte[] b = this.test(mess);
// 将数据发送出去
}
通过 Iridium_MessageInfo mess 初始化结构体 。 然后通过 test() 方法将结构体转换成 BYTE[]
功能是成功的。 但是
Iridium_MessageInfo mess = new Iridium_MessageInfo(0xd7, messagetype.IRIDIUM_MESSAGE_TYPE_LINK, 1, 23, 12, new byte[]{0x01,0x02,0x03,0x04});
最后一个参数 new byte[]{0x01,0x02,0x03,0x04} 却有些混乱了 每次得到的都不一样 ,而且不是原来的数据 1 2 3 4
,前面的数据都是对的。这个是什么原因造成的呢? 只有转换byte[]的时候才出现这个错误。
解决方案 »
- 报错:用户代码未处理 EntityCommandExecutionException 该怎么处理?
- .NET Listview显示LargeIcon模式时候,文字是被截断的? 怎么能多显示写文字出来?
- 事物
- 在MVS2005中调试正常,但是发布后执行老是说com控件注册失败
- 关于网络传输中的丢包问题的处理
- 关于Winform中的DataGrid控件(高手快来,急,求)
- 如何计算BitMap的可见区域大小?着急!
- 关于用流的写操作中遇到的实际问题 解决立即给分 up给分
- 请问我的web.config 文件错在哪?
- C# for循环执行异步操作asyncMethod方法回调问题
- c#AJAX问题
- 网页错误
private byte[] messageData; //报文数据messageData定长比较好办,但如果是根据len不定长,不要跟结构定义在一起,
至于为什么,只说一点,C#的数组是引用类型把结构去掉byte[]后作为MessageHeader,
把Byte[]作为MessageData放到结构外面了定义.