2 wen375827006 wen375827006 于 2016.09.09 16:30 提问

unity3d struct 与 byte[] 之间的转换?

我用C#作为unity的脚步,现在我写了一个结构体,想把它转为byte[]类型,方法如下
public static byte[] StructToBytes(object structObj)
{
int size = Marshal.SizeOf(structObj);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(structObj, buffer, true);
byte[] bytes = new byte[size];
Marshal.Copy(buffer, bytes, 0, size);
return bytes;
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}
但是这里出现一个问题,如果结构体里面没数组,能转成功,但是如果有数组,数组部分就会变为别的数据,这是什么原因呢?而且在反转的时候,数组部分数据会丢失

2个回答

caozhy
caozhy   Ds   Rxr 2016.09.09 22:59

http://blog.csdn.net/masterft/article/details/1699009
要给你的结构体指定内存布局

wen375827006
wen375827006   2016.09.12 09:38

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
struct CMD_GP_LogonAccounts
{
public uint dwPlazaVersion;

[MarshalAs(UnmanagedType.ByValArray,SizeConst=33*2)]
public char[] szMachineID;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 33*2)]
    public char[] szPassword;               
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32*2)]
    public char[] szAccounts;       
};
    我指定了内存布局,如上面,不知哪里有问题呢?C#是没问题的,就在UNIty上有问题
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C#中结构体struct和字节数组Byte的之间的转换函数
在tcp通讯的时候经常会遇到 struct传输的情况。但是C#中tcp只能传送byte[]类型,于是struct与byte相互转化就成为了一个麻烦的事情,这里提供两个方法。
golang中struct和[]byte的相互转换
golang struct和[]byte转换
Go conversion between struct and byte
点击打开链接
Unity与c++ 结构体中带数组参数传递
在unity与c++ 进行交互中往往会有结构体的数据传递,如果在结构体中定义了数组,那么在unity中需要怎样去定义结构体从而对应c++中定义的带有数组的结构体呢. 请看代码: #ifndef TRACK_H_H_ #define TRACK_H_H_ #define TRACK_POINT_SIZE 68 #define TRACK_MOUNT_POINT_SIZE 11 #ifdef
字节转化为结构体BytesToStruct
字节转化为结构体BytesToStruct
c# 结构体struct包含数与byte类型的转换(一)
对与c#中结构体 struct 和byte类型的数组之间的相互转换可以参照   http://kb.cnblogs.com/a/1685137/ 代码贴在下面 注 在使用之前要设置编译器可以使用unsafe的状态 可以参考     http://blog.csdn.net/csskysea/article/details/6970402 using System.Runtime.In
C# 中将自定义的structure转换为byte[] 及Stream 和 byte[] 之间的转换(文件流的应用)
在Socket编程中经常会碰到将Struct转换为byte数组进行传送的情况. 如果服务器和客户端都是自己开发的话, 用序列化和反序列化当然会比较简单, 但序列化后会数据里会包含一些额外的数据,如:程序集名称、版本、公钥等, 不适用于一端是非托管程序. 在.NET Framework的System.Runtime.InteropServices.Marshal类中包含两个方法可以解决此问题: S
Golang中结构体转byte数组
func bb(){ buf := new(bytes.Buffer) var data = []interface{}{ uint16(61374), int8(-54), uint8(254), } for _, v := range data { err := binary.Write(buf, b
关于bit与Byte之间的互相转换
关于bit与Byte的问题: 一共有4096位,512个字节 0000 0001 ----------> 01 1.      标示“1”的位置,连续用“-”符号  // 字节串,如01 01 00 01 // 以上字节转换为比特0000 0001 0000 0001 0000 0000 0000 0000 0000  0001                  // 以上解析出来为8
结构体转换byte数组
/// <summary> /// 单个结构体转换byte数组 /// </summary> /// <param name="structObj">结构体对象</param> /// <returns></returns> public static byte[] StructToBytes(object structObj) { //得到结构体的大小 int size = Marsh