您的位置:首页 > 编程语言 > C#

(一)一个工作任务引起的乱战——c#中结构体与byte[]间相互转换

2013-06-20 16:05 363 查看
一个工作任务涉及到c#与c++系统间的udp通信,处理了蛮长时间没有完成任务,但是期间接触到不少小知识点。本人是初接触c#,c++语言没有接触过。可能写的东西都很小儿科,暂且记录下来当工作日记把。

先解决本文的主题:c#中结构体与byte[]间相互转换,以便帮助查阅到的人解决一下问题。在工作任务过程中,学习到了c#中结构体与byte[]间相互转换。做的代码实验如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Net.Sockets;
using System.Net;

namespace structUDPBaowen
{
class Program
{
// 结构体到byte[]
public static byte[] StrutsToBytesArray(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;
}

// byte[]到结构体
public static object BytesToStruts(byte[] bytes, Type type)
{
//得到结构体的大小
int size = Marshal.SizeOf(type);
//byte数组长度小于结构体的大小
if (size > bytes.Length)
{
//返回空
return null;
}
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将byte数组拷到分配好的内存空间
Marshal.Copy(bytes, 0, structPtr, size);
//将内存空间转换为目标结构体
object obj = Marshal.PtrToStructure(structPtr, type);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回结构体
return obj;
}

public struct udp_data
{
public int packindex;//包序号
public int type;//数据类型
public int length;//数据长度
public byte[] data;//数据体
}

static void Main(string[] args)
{
Program p = new Program();
udp_data sd = new udp_data();
sd.packindex = 1;
sd.type = 0;
byte[] btmp = Encoding.UTF8.GetBytes("你好啊");
sd.data = btmp;
sd.length = btmp.Length;
byte[] structToB = StrutsToBytesArray(sd);//结构体到byte[]
udp_data byteToStru = (udp_data)BytesToStruts(structToB, sd.GetType());// byte[]到结构体
//打印一个成员看结果
Console.WriteLine(byteToStru.packindex);
Console.WriteLine(byteToStru.type);
Console.WriteLine(byteToStru.length);
Console.WriteLine(Encoding.UTF8.GetString(byteToStru.data));
Console.ReadLine();
}
}
}


【运行结果】:
1

0

9

你好啊

如果你感兴趣可以往下读。哈哈

这次的工作任务大概是我所处的用c#写的Windows下的A系统,要向B系统发送消息,由B系统邮件。

遇到的困难是:B系统提供的API是c++写的Linux下的文件,而我们的系统是c#写的Windows下的代码。API只包含头文件与库文件,没有源码也无法转换成可以使用的dll文件。所以这个API作废。

于是我们想采取一个迂回策略,将消息发到一个C系统,因为他们也有发邮件的服务要处理,由他们再把消息发到B系统来发邮件。C系统也提供了一个API,这次同样是c++写的Linux下的文件,但是有源码。于是我想着把它编译成c#可以调用的dll,下一文将写出转换过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: