因为程序必须要和C++开发的程序通信,而通信数据的是结构体的转化后的字节流,那么就要求C#能够顺利的将字节流转换为C#结构体。
1.定义与C++对应的C#结构体
代码
//C++结构体
struct tagCheakUser
{
char userName[12];
char pwd[32];
}
//对应的C#结构体
[StructLayout( LayoutKind.Sequential,Pack=1)]
public struct CheckUser
{
[MarshalAs( UnmanagedType.ByValTStr,SizeConst=12)]
public string userName;
[MarshalAs(UnmanagedType .ByValTStr,SizeConst=32)]
public string pwd;
}
在C++的头文件定义中,使用了 #pragma pack 1 字节按1对齐,所以C#的结构体也必须要加上对应的特性,LayoutKind.Sequential属性让结构体在导出到非托管内存时按出现的顺序依次布局,而对于C++的char数组类型,C#中可以直接使用string来对应,当然了,也要加上封送的特性和长度限制。
2.结构体与byte[]的互相转换
代码
//convert structure T to byte[]
public static byte[] ConvertStructToBytes(object objStruct)
{
//get the size of structure
int size = Marshal.SizeOf(objStruct);
//define buffer arrays
byte[] buffer = new byte[size];
//Alloc unmanaged memory and Copy structure to unmanaged memory IntPtr ipStruct = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(objStruct, ipStruct, false);
//Copy to the byte array
Marshal.Copy(ipStruct, buffer, 0, size);
//Free unmanaged memory
Marshal.FreeHGlobal(ipStruct);
return buffer;
}
//convert byte array to sturcture
public static TR ConvertBytesToSturct<TR>(byte[] datas)
{
//get size of sturcture
int size = Marshal.SizeOf(typeof(TR));
//can not be convert
if (datas.Length < size)
{
return default(TR);
}
//Alloc unmanaged memory and copy bytes data to memory IntPtr ipSturct = Marshal.AllocHGlobal(size);
Marshal.Copy(datas, 0, ipSturct, size);
//Convert IntPtr to structure
TR objStruct = (TR)Marshal.PtrToStructure(ipSturct,
typeof(TR));
//Free unmanaged memory
Marshal.FreeHGlobal(ipSturct);
return objStruct;
}
3.测试
代码
static void Main(string[] args)
{
DataAPI.CheckUser ckUser = new DataAPI.CheckUser() { userName = "douzi",pwd="00" };
byte[] bDatas = Converter.ConvertStructToBytes(ckUser);
DataAPI.CheckUser ckUser1 =
Converter.ConvertBytesToSturct<DataAPI.CheckUser>(bDatas);
Console.WriteLine("User:{0} Pwd:{1}", ckUser1.userName,
ckUser1.pwd);
sizeof结构体大小
Console.ReadKey();
}
这样,就能有效的和C++通讯了。
测量学试卷 第 4 页(共 7 页)
《测量学》模拟试卷
1.经纬仪测量水平角时,正倒镜瞄准同一方向所读的水平方向值理论上应相差(A )。
A 180°
B 0°
C 90°
D 270°
2. 1:5000地形图的比例尺精度是( D )。
A 5 m
B 0.1 mm
C 5 cm
D 50 cm
3. 以下不属于基本测量工作范畴的一项是( C )。
A 高差测量
B 距离测量
C 导线测量
D 角度测量
4. 已知某直线的坐标方位角为220°,则其象限角为(D )。
A 220°
B 40°
C 南西50°
D 南西40°
5. 由一条线段的边长、方位角和一点坐标计算另一点坐标的计算称为(A )。
A 坐标正算
B 坐标反算
C 导线计算
D 水准计算
6. 闭合导线在X 轴上的坐标增量闭合差( A )。
A 为一不等于0的常数
B 与导线形状有关
C 总为0
D 由路线中两点确定
7. 在地形图中,表示测量控制点的符号属于(D )。
A 比例符号
B 半依比例符号
C 地貌符号
D 非比例符号
8. 在未知点上设站对三个已知点进行测角交会的方法称为(A )。
A 后方交会
B 前方交会
C 侧方交会
D 无法确定
9. 两井定向中不需要进行的一项工作是(C )。
A 投点
B 地面连接
C 测量井筒中钢丝长度
D 井下连接
10. 绝对高程是地面点到( C )的铅垂距离。
A 坐标原点
B 任意水准面
C 大地水准面
D 赤道面
11.下列关于等高线的叙述是错误的是:(A )
A . 高程相等的点在同一等高线上
B . 等高线必定是闭合曲线,即使本幅图没闭合,则在相邻的图幅闭合
C . 等高线不能分叉、相交或合并
一、单项选择题(每小题1 分,共20 分) 在下列每小题的四个备选答案中选出一个正确的答案,并将其字母标号填入题干的括号内。
测量学试卷 第 5 页(共 7 页) D . 等高线经过山脊与山脊线正交
12.下面关于非比例符号中定位点位置的叙述错误的是(B )
A .几何图形符号,定位点在符号图形中心
B .符号图形中有一个点,则该点即为定位点
C .宽底符号,符号定位点在符号底部中心
D .底部为直角形符号,其符号定位点位于最右边顶点处
13.下面关于控制网的叙述错误的是(D )
A . 国家控制网从高级到低级布设
B . 国家控制网按精度可分为A 、B 、
C 、
D 、
E 五等
C . 国家控制网分为平面控制网和高程控制网
D . 直接为测图目的建立的控制网,称为图根控制网
14.下图为某地形图的一部分,各等高线高程如图所视,A 点位于线段MN 上,点A 到点M 和点N 的图上水平距离为MA=3mm ,NA=2mm ,则A 点高程为(A )
A . 36.4m
B . 36.6m
C . 37.4m
D . 37.6m
15.如图所示支导线,AB 边的坐标方位角为''30'30125 =AB α,转折角如图,则CD 边的坐标方位角CD α为( B )
A .''30'3075
B .''30'3015
C .''30'3045
D .''30'2925
16.三角高程测量要求对向观测垂直角,计算往返高差,主要目的是(D )
A . 有效地抵偿或消除球差和气差的影响
B . 有效地抵偿或消除仪器高和觇标高测量误差的影响
C . 有效地抵偿或消除垂直角读数误差的影响
D .有效地抵偿或消除读盘分划误差的影响
17.下面测量读数的做法正确的是( C )
A . 用经纬仪测水平角,用横丝照准目标读数 A N M 37 36 35
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论