当前位置: 首页 > 编程语言 > C#

通用BitConverter方法?分享

时间:2023-04-10 14:06:42 C#

通用BitConverter风格的方法?我最近遇到了一种情况,我需要创建一个通用方法来从字节数组中读取数据类型。我创建了以下类:publicclassDataStream{publicintOffset{get;放;}publicbyte[]数据{得到;放;}publicTRead()whereT:struct{unsafe{intdataLen=Marshal.SizeOf(typeof(T));IntPtrdataBlock=Marshal.AllocHGlobal(dataLen);Marshal.Copy(数据,偏移量,数据块,dataLen);T类型=*((T*)dataBlock.ToPointer());Marshal.FreeHGlobal(数据块);偏移量+=数据长度;返回类型;现在,除了释放问题之外,此代码将不会使用以下消息进行编译:无法获取地址、获取大小或声明指向托管类型('T')的指针,这似乎很奇怪,因为您应该能够执行上述操作基于方法whereT:structconstraints。如果此代码非常不正确,是否有一种简单的方法可以获取字节序列并将它们转换为类型“T”?谢谢!您应该将代码切换为使用Mashal.PtrToStructure而不是尝试通过指针操作来完成。这种方法就是为这种场景设计的。既然已经给出了答案,让我解释一下为什么您的原始代码不适合您:这看起来很奇怪,因为您应该能够根据方法中的T:struct约束执行上述操作。并不真地。您可以拥有指向非托管类型的原始指针。这在C#LanguageSpecification(18.2)中定义如下:与引用(引用类型的值)不同,垃圾收集器不跟踪指针——垃圾收集器不知道指针及其指向的数据。因此,不允许指向引用或包含引用的结构的指针,并且指针的引用类型必须是非托管类型。非托管类型是任何不是引用类型并且在任何嵌套级别都不包含引用类型字段的类型。换句话说,非托管类型是以下之一:所以有很多限制,对于泛型方法,T:struct对于任何特定的实例化可能符合也可能不符合它们,因此像T*这样的构造是非法的。有一个特殊的泛型类型参数约束来覆盖非托管类型会很好,但就目前而言,CLR中没有一个。有一次,我写了这篇文章来解释如何做,但比Marshal.PtrToStructure快很多倍。该代码示例使用动态代码生成将通用类型T复制到比特流或从比特流复制。假设:不安全的TStructBytesToStructure(byte[]data)whereTStruct:struct{fixed(byte*dataPtr=data)return(TStruct)Marshal.PtrToStructure(newIntPtr(dataPtr),typeof(TStruct));}unsafebyte[]StructureToBytes(TStructst)其中TStruct:struct{varbytes=newbyte[Marshal.SizeOf(st)];固定(字节*ptr=字节)Marshal.StructureToPtr(st,新IntPtr(ptr),真);返回字节;我写了一段时间做同样的事情:http://www.codeproject.com/Articles/33713/Generic-BinaryReader-and-BinaryWriter-Extensions但是,您必须将C++/CLI项目添加到VisualStudio解决方案.以上就是C#学习教程:通用BitConverter方法?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: