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

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

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

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Runtime.InteropServices;
     6 using System.Net.Sockets;
     7 using System.Net;
     8 
     9 namespace structUDPBaowen
    10 {
    11     class Program
    12     {
    13        // 结构体到byte[]
    14         public static byte[] StrutsToBytesArray(object structObj)
    15         {
    16             //得到结构体的大小          
    17             int size = Marshal.SizeOf(structObj);
    18             //创建byte数组     
    19             byte[] bytes = new byte[size];
    20             //分配结构体大小的内存空间           
    21             IntPtr structPtr = Marshal.AllocHGlobal(size);
    22             //将结构体拷到分配好的内存空间           
    23             Marshal.StructureToPtr(structObj, structPtr, false);
    24             //从内存空间拷到byte数组       
    25             Marshal.Copy(structPtr, bytes, 0, size);
    26             //释放内存空间          
    27             Marshal.FreeHGlobal(structPtr);
    28             //返回byte数组         
    29             return bytes;
    30         }
    31 
    32         // byte[]到结构体
    33         public static object BytesToStruts(byte[] bytes, Type type)
    34         {
    35             //得到结构体的大小        
    36             int size = Marshal.SizeOf(type);
    37             //byte数组长度小于结构体的大小        
    38             if (size > bytes.Length)
    39             {
    40                 //返回空               
    41                 return null;
    42             }
    43             //分配结构体大小的内存空间      
    44             IntPtr structPtr = Marshal.AllocHGlobal(size);
    45             //将byte数组拷到分配好的内存空间         
    46             Marshal.Copy(bytes, 0, structPtr, size);
    47             //将内存空间转换为目标结构体        
    48             object obj = Marshal.PtrToStructure(structPtr, type);
    49             //释放内存空间          
    50             Marshal.FreeHGlobal(structPtr);
    51             //返回结构体        
    52             return obj;
    53         }
    54 
    55         public struct udp_data
    56         {
    57             public int packindex;//包序号         
    58             public int type;//数据类型       
    59             public int length;//数据长度        
    60             public byte[] data;//数据体
    61         }
    62 
    63         static void Main(string[] args)
    64         {
    65             Program p = new Program();
    66             udp_data sd = new udp_data();
    67             sd.packindex = 1;
    68             sd.type = 0;
    69             byte[] btmp = Encoding.UTF8.GetBytes("你好啊");
    70             sd.data = btmp;
    71             sd.length = btmp.Length;
    72             byte[] structToB = StrutsToBytesArray(sd);//结构体到byte[]
    73             udp_data byteToStru = (udp_data)BytesToStruts(structToB, sd.GetType());// byte[]到结构体
    74             //打印一个成员看结果
    75             Console.WriteLine(byteToStru.packindex);
    76             Console.WriteLine(byteToStru.type);
    77             Console.WriteLine(byteToStru.length);
    78             Console.WriteLine(Encoding.UTF8.GetString(byteToStru.data));
    79             Console.ReadLine();
    80         }
    81     }
    82 }

    【运行结果】:
    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,下一文将写出转换过程。

  • 相关阅读:
    程序员过年必备 -- Auto.js微信自动抢红包
    VSCode, Django, and Anaconda开发环境集成配置[Windows]
    pandas to_excel 修改excel样式以及格式
    hvac系统开源项目情况匠能智控
    安卓作业(有空再整理)
    在jetson nano中配opencv环境(python通用)
    获取深度图像
    英伟达开发板安装python-opencv下的问题
    在vs2015中对kinectV2环境搭建,环境配置
    PagerSlidingTabStrip 导入 Android Studio 的教程
  • 原文地址:https://www.cnblogs.com/echolxl/p/3146185.html
Copyright © 2011-2022 走看看