- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE
PAGE #/ 8
C#数组、字节数组、转换等
在 System 名称空间里面有许多跟 Array 操作相关的类。其中 System.Array 类里面就提供了以下常用的方法:
BinarySearch:
使用二进制搜索算法在一维的排序 Array 中搜索值。
Copy:
将一个Array的一部分元素复制到另一个Array中,并根据需要执行类型强 制转换和装箱。
CopyTo:
将当前一维Array的所有元素复制到指定的一维 Array中。
Resize:
将数组的大小更改为指定的新大小。
Sort:
对一维 Array 对象中的元素进行排序。
与大多数类不同,Array提供Createlnstanee方法,以便允许后期绑定访 问,而不是提供公共构造函数。
Array.Copy方法不仅可在同一类型的数组之间复制元素,而且可在不同类型 的标准数组之间复制元素;它会自动处理强制类型转换。有些方法,如
Create In sta nee Copy、CopyTo GetValue 和 SetValue,提供重载(接受 64 位整 数作为参数),以适应大容量数组。 LongLength和GetLongLength返回指示数组
长度的64位整数。在执行需要对 Array进行排序的操作(如BinarySearch之 前,必须对 Array 进行排序。
ArrayList跟Array不同,前者是集合对象,ArrayList的ToArray方法可以直 接将ArrayList里面的全部元素导出到一个数组里,而不需用循环逐个元素地复 制到一个数组。
ToArray 的使用方法如下:
ArrayList ay = new ArrayList();
ay.Add(sheep);
ay.Add(cat);
ay.Add(dog);
string[] al= (string[])ay.ToArray(typeof(string));
Console.WriteLine(al[0]);
关键的地方在于ToArray的参数,这里应该用反射中的typeof获取arraylist 里面元素的原始数据类型。
在数组中有一种比较特殊的:
字节数组,即byte[]。内存、文件中的数据都是以字节数组的形式储存的, 如果程序需要对数据进行操作的话,或多或少都会使用到 byte[]。
对于byte[]跟其他类型的相互转换问题,在 C++中,使用Memorycopy函数 即可完成,虽然在C#里面也有类似MemoryCopy的函数:
Buffer.BlockCopy,但由于强类型的特性,在 C#里它并实现不了字节数组跟 其他类型转换的功能。
为了解决这个问题,需要手工写将其他类型的数据通过位运算和逻辑运算 而得到字节数组。如下面的代码:
// 整型转换为字节数组
int i = ; //对应的十六进制是: 0012D687
byte[] db = new byte[4]; //int 为 4 字节(即 32 位)的整数
db[0] = (byte)(i 0x000ff); // 取第 1,2 位
db[1] = (byte)((i 0x00ff00) 8); //取第 3,4位,并右移 2 位
db[2] = (byte)((i 0x00ff00) 16); //取第 5,6位,并右移 4 位
db[3] = (byte)((i 0xff000) 24); //取第 7,8位,并右移 6 位
Console.WriteLine(使用AND位运算和移位运算转换成数组:
{0},{1},{2},{3}, db[0], db[1], db[2], db[3]);// 字节数组转换为整型
int j = 0;
j = (int)db[0]; // 还原第 1 字节(低位)
j += (int)db[1] 8; //还原第 2字节
j += (int)db[2] 16; //还原第 3字节
j += (int)db[3] 24; //还原第 4字节(高位)
Co nsole.WriteL ine(使用移位运算还原为整数:
{0}, j);
另外一个方法是使用 Marshal 来实现, Marshal 类包含了内存操作的大部分 方法,如空间的分配,指针,内存复制,内存读写等。下面用 Marshal 实现上 面同样的功能的代码:
int i = ; //对应的十六进制是: 0012D687
// 使用 Marshal 转换到数组
byte[] newdb = new byte[4];
IntPtr p=Marshal.AllocHGlobal
(4); // 分配内存空间,返回空间指针
Marshal.WriteInt32(p, i); // 将 int
文档评论(0)