(一)一个工作任务引起的乱战——c#中结构体与byte[]间相互转换
2013-06-20 16:05
363 查看
一个工作任务涉及到c#与c++系统间的udp通信,处理了蛮长时间没有完成任务,但是期间接触到不少小知识点。本人是初接触c#,c++语言没有接触过。可能写的东西都很小儿科,暂且记录下来当工作日记把。
先解决本文的主题:c#中结构体与byte[]间相互转换,以便帮助查阅到的人解决一下问题。在工作任务过程中,学习到了c#中结构体与byte[]间相互转换。做的代码实验如下:
【运行结果】:
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,下一文将写出转换过程。
先解决本文的主题: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,下一文将写出转换过程。
相关文章推荐
- (一)一个工作任务引起的乱战——c#中结构体与byte[]间相互转换
- (一)一个工作任务引起的乱战——c#中结构体与byte[]间相互转换
- (二)一个工作任务引起的乱战——C++程序编译为dll,让C#调用
- (三)一个工作任务引起的乱战——udp通信
- C#下byte数组与string的相互转换
- [C#] Byte[]、Image、Bitmap 之间的相互转换
- c#中 uint--byte[]--char[]--string相互转换汇总
- 在C#中将任意数值类型数据与字节数组相互转换的一个方法
- c#中 uint--byte[]--char[]--string相互转换汇总
- c#中 uint--byte[]--char[]--string相互转换汇总
- C# string类型和byte[]类型相互转换
- C# string类型和byte[]类型相互转换
- c# 中Bitmap, byte[] ,Stream 文件相互转换
- c#中 uint--byte[]--char[]--string相互转换汇总
- Java工作笔记:关于Java调用C库时,Json和结构体间相互转换
- C#实现DateTime与byte[]相互转换
- C#下byte数组与string的相互转换
- Java工作笔记:关于Java调用C库时,Json和结构体间相互转换
- C# string类型和byte[]类型相互转换
- 结构体和二进制数据相互转换c#(good)