C#结构与指针互相操作-结构与byte数组-所有字符串详解

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

PRivatevoidtreeView1_MouseDown(objectsender,MouseEventArgse)...{if(e.Button==MouseButtons.Right)//判断你点的是不是右键...{PointClickPoint=newPoint(e.X,e.Y);TreeNodeCurrentNode=treeView1.GetNodeAt(ClickPoint);if(CurrentNode!=null)//判断你点的是不是一个节点...{switch(CurrentNode.Name)//根据不同节点显示不同的右键菜单,当然你可以让它显示一样的菜单...{caseerrorUrl:CurrentNode.ContextMenuStrip=contextMenuStripErrorUrl;break;}treeView1.SelectedNode=CurrentNode;//选中这个节点}}}-资料引用:(deptNo!=0){sql+=int.Parse(SystemParameter.GetValueByType(QueryOnlySelfNode))==1?andDeptNo=@DeptNo:and@DeptNo=substring(DeptNo,1,len(@DeptNo));splist.AddAParameter(@DeptNo,SqlDbType.VarChar,12,deptNo);}if(apartmentNo!=0){sql+=int.Parse(SystemParameter.GetValueByType(QueryOnlySelfNode))==1?andApartmentNo=@ApartmentNo:and@ApartmentNo=substring(ApartmentNo,1,len(@ApartmentNo));splist.AddAParameter(@ApartmentNo,SqlDbType.VarChar,16,apartmentNo);}查询部门下的用户信息:支持仅查询该部门的用户信息还是查询该部门和子部门的用户信息请在系统设置SystemParameter中设置WCF:WindowsCommunicationFoundation窗体通信基础//指针转化为结构的代码Test是个结构体IntPtrp13=ReadStruct();Testtest13=(Test)Marshal.PtrToStructure(p13,typeof(Test));结构中的数组C++:inta[5];(C++wcharwide字符即unicode字符)C#声明:[MarshalAs(UnmanagedType.ByValArray,SizeConst=5)]publicint[]a;C#使用C++结构体时结构的上面加入属性[StructLayout(LayoutKind.Sequential)]C#方法和类型使用Pascal命名成员变量和局部变量使用camel命名Winform使用Hungarian命名c++经常使用匈牙利命名,如membervariable使用m_结构转化为指针的方法://Marshal.AllocHGlobal和WIN32API,Alloc功能基本一样,//这个方法不要多用,可能造成内存泄露。//记住使用Marshal.FreeHGlobal函数释放申请的内存IntPtrp=Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Test)));Marshal.StructureToPtr(_test,p,false);C#中一维数组int[]二维数组int[,]交错数组int[][]三维数组int[,,]int[]dimensionOne=newint[5];int[,]dimensionTwo=newint[3,4];//3行4列int[][]dimensionInterlace=newint[3][];//由3个int[]元素组成的数组每个元素(1个数组)的数组长度可以是不确定的int[,,]dimensionThree=newint[2,3,4];为了定义一个Unicode数据类型,通常使用WCHAR(或wchar_t)来定义一个Unicode字符变量或者字符数组,使用LPWSTR定义一个指向Unicode字符串的指针(w前缀意思为wide就是unicode)为了使字符和字符串可以适用于Unicode编码系统,也可以适用于ANSI编码的操作系统,可以将字符或字符串定义为双模式的。通常采用函数TEXT()或_T()宏,它们被定义于tchar.h头文件中。例如,TEXT(hello“)表示一个双模式的字符串,如果编译器发现定义_UNICODE预处理器符号那么TEXT(hello“)就被转换为LHello,否则被转换为Hello.char*str={“myfirststring”};//ansi字符串wchar_t*wstr={L”myfirststring”};//unicode字符串size_tlen=strlen(str);//ansi字符串求长度size_twlen=wcslen(wstr);//unicode字符串求长度printf(“%s%ws%d%d”,str,wstr,len,wlen);//打印两种字符串当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。软件一般采用三种方式来决定文本的字符集和编码:检测文件头标识,提示用户选择,根据一定的规则猜测最标准的途径是检测文本最开头的几个字节,开头字节Charset/encoding,ANSI:全称是:AmericanNationalStandardInstitute中文译名:美国国家标准协会(gb2312、big5、jis都是ANSI编码的子集)为使计算机支持更多语言,通常使用0x80~0xFF范围的2个字节来表示1个字符。比如:汉字'中'在中文操作系统中,使用[0xD6,0xD0]这两个字节存储。不同的国家和地区制定了不同的标准,由此产生了GB2312,BIG5,JIS等各自的编码标准。这些使用2个字节来代表一个字符的各种汉字延伸编码方式,称为ANSI编码。在简体中文系统下,ANSI编码代表GB2312编码,在日文操作系统下,ANSI编码代表JIS编码。不同ANSI编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段ANSI编码的文本中。BSTR是“BasicSTRing”的简称,微软在COM/OLE中定义的标准字符串数据类型。一种通用的字符串类型,可以很容易的匹配到不同编程语言C#CharSet.Auto☆LPCTSTR:longpointerconstantText宏L表示long指针long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义P表示这是一个指针C表示是一个常量T表示在Win32环境中,有一个_T宏STR表示这个变量是一个字符串☆LPSTR和LPWSTR是Win32和VC++所使用的一种字符串数据类型。LPSTR被定义成是一个指向以NULL(‘\0’)结尾的32位ANSI字符数组指针,而LPWSTR是一个指向以NULL结尾的64位双字节字符数组指针。CString与LPSTR转换。'L'代表Long,'P'代表了pointer(即为指针的意思),'STR'意为String的意思。☆LPCSTR是Win32和VC++所使用的一种字符串数据类型。LPCSTR被定义成是一个指向以NULL(‘\0’)结尾的常量字符的指针。L表示long指针P表示这是一个指针C表示是一个常量STR表示这个变量是一个字符串T表示_T宏,这个宏用来表示你的字符是否使用UNICODE,如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。(前缀T表示自动兼容性)☆LPTSTR与char*等价,表示普通字符/字符串变量,指向字符/字符串的指针。LP:长指针(longpointer)。T:win32环境中有一个_T宏,用来标识字符是否采用Unicode编码(两字节表示一个字符),若程序中定义了Unicode,该字符/字符串被作为Unicode字符串,否则就是标准的ANSI(单字节表示一个字符)字符串。STR:表示这个变量是一个字符串。在C++程序中byte和char都占用一个字节,取值范围不同,就像是unsignedint和int的区别一样。byte和char的取值范围分别是:byte0--255(byte就是unsignedchar)char-128-127//求整数数组中两两之差的绝对值最小的值,只需求出最小差值即可在写C#TCP通信程序时,发送数据时,只能发送byte数组,处理起来比较麻烦不说,如果是和VC6.0等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把一个char[]数组转换为一个结构体,而在C#却不能直接把byte数组转换为结构体,要在C#中发送结构体,可以按以下方法实现:1)定义结构体://命名空间usingSystem.Runtime.InteropServices;//注意这个属性不能少[StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]structTestStruct{publicintc;//字符串,SizeConst为字符串的最大长度[MarshalAs(UnmanagedType.ByValTStr,SizeConst=256)]publicstringstr;//int数组,SizeConst表示数组的个数,在转换成//byte数组前必须先初始化数组,再使用,初始化//的数组长度必须和SizeConst一致,例test=newint[6];[MarshalAs(UnmanagedType.ByValArray,SizeConst=6)]publicint[]test;}2)结构体转byte数组:/**////summary///结构体转byte数组////summary///paramname=structObj要转换的结构体/param///returns转换后的byte数组/returnspublicstaticbyte[]StructToBytes(objectstructObj){//得到结构体的大小intsize=Marshal.SizeOf(structObj);//创建byte数组byte[]bytes=newbyte[size];//分配结构体大小的内存空间IntPtrstructPtr=Marshal.AllocHGlobal(size);//将结构体拷到分配好的内存空间Marshal.StructureToPtr(structObj,structPtr,false);//从内存空间拷到byte数组Marshal.Copy(structPtr,bytes,0,size);//释放内存空间Marshal.FreeHGlobal(structPtr);//返回byte数组returnbytes;}3)byte数组转结构体:/**////summary///byte数组转结构体////summary///paramname=bytesbyte数组/param///paramname=type结构体类型/param///returns转换后的结构体/returnspublicstaticobjectBytesToStruct(byte[]bytes,Typetype){//得到结构体的大小intsize=Marshal.Si

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功