C#学习教程:将不同值类型的数组转换为字节数组关于更好的方法的想法?publicvoidToBytes(object[]data,byte[]buffer){byte[]bytes;int偏移量=0;foreach(objectobjindata){if(objisstring)bytes=System.Text.Encoding.UTF8.GetBytes(((string)obj));elseif(objisbool)obytes=BitConverter.GetBytes((bool)obj);elseif(objischar)obytes=BitConverter.GetBytes((char)obj);//对每个值类型依此类推Buffer.BlockCopy(obytes,0,buffer,offset,bytes.Length);offset+=bytes.Length;好吧,你可以有这样的地图:privatestaticreadonlyDictionary>Converters=newDictionary>(){{typeof(string),o=>Encoding.UTF8.GetBytes((string)o)},{typeof(bool),o=>BitConverter.GetBytes((bool)o)},{typeof(char),o=>BitConverter.GetBytes((char)o)},...};publicstaticvoidToBytes(object[]data,byte[]buffer){intoffset=0;foreach(objectobjindata){if(obj==null){//或者做任何你想做的事情thrownewArgumentException("无法转换空值");函数转换器;if(!Converters.TryGetValue(obj.GetType(),outconverter)){thrownewArgumentException("Noconverterfor"+obj.GetType());}}byte[]obytes=converter(obj);Buffer.BlockCopy(obytes,0,buffer,offset,bytes.Length);offset+=obytes.Length;您仍在为每种类型指定转换器,但它比if/else形式更紧凑还有各种其他方法来构建字典,顺便说一句。你可以这样做:privatestaticreadonlyDictionary>Converters=newDictionary>();静态WhateverYourTypeIsCalled(){AddConverter(Encoding.UTF8.GetBytes);添加转换器(BitConverter.GetBytes);添加转换器(BitConverter.GetBytes);}staticvoidAddConverter(Funcconverter){Converters.Add(typeof(T),x=>converter((T)x));我看到另一个建议二进制序列化的答案。我个人不喜欢这种“不透明”的序列化方案。我想知道数据的确切含义,这意味着我可以将它移植到其他平台。但是,我要指出的是,您当前的方案没有给出任何类型的定界符——例如,如果您有两个字符串,您不知道哪个停止,另一个停止。您也不存储类型信息——这可能很好,但可能不存在。变长问题通常更为重要。您可能会考虑使用长度前缀方案,例如BinaryWriter。事实上,BinaryWriter通常可能是一个更简单的解决方案。您可能仍希望拥有委托映射,但让它们执行BinaryWriter和值操作。然后,您可以通过反射构建映射,或者只是一个硬编码的调用列表。然后您只需初始化一个包装MemoryStream的BinaryWriter,适当地写入每个值,然后在MemoryStream上调用ToArray以获得结果。也许您应该考虑改用BinaryFormatter:varformatter=newBinaryFormatter();varstream=newMemoryStream();formatter.Serialize(stream,obj);byte[]结果=stream.ToArray();如果您想避免重新发明轮子,有一些非常好的序列化框架,例如GoogleProtocolBuffers。可以使用StreamWriter写入一个内存流,并使用它的buffer:以上是C#学习教程:将不同值类型的数组转换为字节数组,这里分享一下,如果对大家有用,还需要进一步了解C#学习教程,希望大家多多关注——{byte[]result;使用(MemoryStreamstream=newMemoryStream()){StreamWriterwriter=newStreamWriter(stream);writer.WriteLine("测试");writer.WriteLine(12);作家.WriteLine(真);writer.Flush();结果=stream.GetBuffer();}using(MemoryStreamstream=newMemoryStream(result)){StreamReaderreader=newStreamReader(stream);while(!reader.EndOfStream)控制台.WriteLine(reader.ReadLine());}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
