一个工作任务涉及到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, , 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, , 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 = ;
sd.type = ;
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[]间相互转换的更多相关文章

  1. (二)一个工作任务引起的乱战——C++程序编译为dll,让C#调用

    C++程序编译为C#可调用的dll的过程: 1.新建一个Win32 Console Application 项目,项目名为:DLLDemo,下一步选择Application type为DLL; 2.在 ...

  2. (三)一个工作任务引起的乱战——udp通信

    先上代码.该代码是在问度娘的过程中搜到的,自己实验运行了下,可以使用(vs2010  net fram4.0).服务端代码: using System;using System.Collections ...

  3. 给大家补充一个结构体的例子:下面TwoNumber就是一个形式上的结构体

    给大家补充一个结构体的例子:下面TwoNumber就是一个形式上的结构体: class TwoNumber {     int num1;     int num2; } public class T ...

  4. 在Excel里如何将多个工作簿合并到一个工作簿中

    在Excel里如何将多个工作簿合并到一个工作簿中 当你必须将多个工作簿合并到一个工作簿时,你遇到过麻烦吗?最让人心烦的就是需要合并的工作簿里有很多张工作表.有人能推荐方法解决这个问题吗? 利用VBA ...

  5. EXCEL 如何将多个工作表或工作簿合并到一个工作表

    在使用Excel 时,我们经常需要将多个工作表或工作簿合并到一个工作表中,这样我们就能快速地对数据进行分析和统计.对于一般用户而言,除了复制每个工作表后再粘贴,没有其他什么方法了.如果只是合并少数几个 ...

  6. 用VBA宏从一个工作薄复制内容到另一个工作薄

    我们项目管理有两个工作薄,一个里面有多个表,每天建一个,记录当天项目,另一个工作薄,有多个表,其中一个是所有项目汇总. 以前都是第一个工作薄一个表做完,再复制粘贴到第二个工作薄的汇总表中. 写了个VB ...

  7. Excel 2010 如何将筛选后的数据复制粘贴到另一个工作表筛选后的表格里

    如果你是指自动筛选后,把筛选数据复制/粘贴到另外一个工作表中,不妨试试试 第一步选中筛选后的数据区域:第二步执行菜单命令“编辑/定位/定位条件/可见单元格”,确定:第三步单击复制按钮或者Ctrl+C或 ...

  8. Excel 一个工作表进行按行数拆分

    1. 如下Excel表,总共有120多行数据,如何将以50行数据为一个工作表进行拆分 Sub ZheFenSheet() Dim r, c, i, WJhangshu, WJshu, bt As Lo ...

  9. EXCEL中,怎样查看一个工作簿中有几个工作表?

    EXCEL中,怎样查看一个工作簿中有几个工作表 有几个EXCEL文件,每个文件(工作簿)中都有上百个工作表, 怎样可以一次性查看一个簿包含几个表? 目前好像没有直接可以看到有多少张工作表的按钮,这就需 ...

随机推荐

  1. 传输层-UDP

    传输层构建在网络层之上,传输层提供端口到端口之间的通讯. 传输层通过端口号来标识一个端口,不同于网卡,端口是逻辑上的概念.传输层的端口为16个比特(bit)长度,即最多能表示65 536个端口,端口号 ...

  2. php魔法常量

    有七个魔术常量它们的值随着它们在代码中的位置改变而改变.例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定.这些特殊的常量不区分大小写,如下: 名称 说明 __LINE__ 文件中的当前行号 ...

  3. oracle单行函数之日期函数

    在日期上加上或减去一个数字结果仍为日期. 两个日期相减返回日期之间相差的天数. 可以用数字除24来向日期中加上或减去小时. SQL from dual; SYSDATE SYSDATE ------- ...

  4. XML Schema (1)

    XML Schema 是基于 XML 的 DTD 替代者. XML Schema 描述 XML 文档的结构. XML Schema 语言也称作 XML Schema 定义(XML Schema Def ...

  5. 基础知识 mfc

    句柄 资源的标示  图标句柄(HICON) 光标句柄(HCURSOR) 窗口句柄(HWND) 类似于指针 wm_keydown表示键盘上的按键按下了数值 WPARAM ||LPARAM  两个整形数据 ...

  6. linux笔记2.25

    解决vsftpd用root登录不了的问题 把/etc/pam.d/vsftpd文件中的 auth       required    pam_listfile.so item=user sense=d ...

  7. php 用post请求调用接口api

    $post_data=""; $ch = curl_init(); $url = ''; curl_setopt($ch , CURLOPT_URL , $url); curl_s ...

  8. swift代码排版-参考

    代码排版包括: 空行.空格.断行和缩进等内容.代码排版内容比较多工作量很多,但是非常重要. 空行 空行将逻辑相关的代码段分隔开,以提高可读性.下列情况应该总是添加空行: 类型声明之前. import语 ...

  9. 『安全工具』Nmap 强悍的端口扫描工具

    作为时下流行的端口扫描工具,Nmap有因其扫描的隐密性有“端口扫描之王”之称 上图是黑客帝国(The Matrix)中崔妮蒂用Nmap入侵核发电站的能源管理系统 0x 01 Nmap介绍 Nmap是一 ...

  10. HDOJ(HDU) 1408 盐水的故事

    Problem Description 挂盐水的时候,如果滴起来有规律,先是滴一滴,停一下:然后滴二滴,停一下:再滴三滴,停一下-,现在有一个问题:这瓶盐水一共有VUL毫升,每一滴是D毫升,每一滴的速 ...