结构体和二进制转换


记录:

using UnityEngine;
using System.IO;
using System.Runtime.InteropServices;
/// <summary>
/// 结构体和二进制相互转换
/// </summary>
public class FileTest11 : MonoBehaviour {

    private int size;
	// Use this for initialization
	void Start () {

        FileStream fs = new FileStream("d://jtest11.txt", FileMode.OpenOrCreate);
        BinaryWriter b = new BinaryWriter(fs);
        Vector3 v = new Vector3(31, 2, 3);
        byte[] bytes = StructToBytes(v);
        b.Write(StructToBytes(v));
        b.Close();
        for (int i = 0; i < bytes.Length; i++) {

            Debug.LogError("============="+bytes[i]);

        }
        //b.
    }
	
	// Update is called once per frame
	void Update () {

        if (Input.GetKeyDown(KeyCode.Space)) {


            FileStream fstream= File.OpenRead("d://jtest11.txt");

            BinaryReader reader = new BinaryReader(fstream);

            byte[] bs= reader.ReadBytes(size);

            Debug.LogError("================" + (Vector3)BytesToStruct(bs, typeof(Vector3)));
            reader.Close();
        }
	}

    public byte[] StructToBytes(object obj)
    {
        //得到结构体的大小
         size = Marshal.SizeOf(obj);
        //创建byte数组
        byte[] bytes = new byte[size];
        //分配结构体大小的内存空间
        System.IntPtr structPtr = Marshal.AllocHGlobal(size);
        //将结构体拷到分配好的内存空间
        Marshal.StructureToPtr(obj, structPtr, false);
        //从内存空间拷到byte数组
        Marshal.Copy(structPtr, bytes, 0, size);
        //释放内存空间
        Marshal.FreeHGlobal(structPtr);
        //返回byte数组
        return bytes;
    }


    /// <summary>
    /// byte数组转结构
    /// </summary>
    /// <param name="bytes">byte数组</param>
    /// <param name="type">结构类型</param>
    /// <returns>转换后的结构</returns>
    public object BytesToStruct(byte[] bytes, System.Type type)
    {
        //得到结构的大小
        int size = Marshal.SizeOf(type);
        Debug.LogError(size.ToString());
        //byte数组长度小于结构的大小
        if (size > bytes.Length)
        {
            //返回空
            return null;
        }
        //分配结构大小的内存空间
        System.IntPtr structPtr = Marshal.AllocHGlobal(size);
        //将byte数组拷到分配好的内存空间
        Marshal.Copy(bytes, 0, structPtr, size);
        //将内存空间转换为目标结构
        object obj = Marshal.PtrToStructure(structPtr, type);
        //释放内存空间
        Marshal.FreeHGlobal(structPtr);
        //返回结构
        return obj;
    }
}

阅读更多
换一批

没有更多推荐了,返回首页