C#由转换二进制所引起的思考,了解下?资料

本文主要介绍C#由转换二进制所引起的思考,了解下?资料 方法和在新技术下所面对的“挑战”,方便大家深入理解C#由转换二进制所引起的思考,了解下?资料 过程。本文也将分享C#由转换二进制所引起的思考,了解下?资料 所遇到的问题和应对策略,怎么解决怎么做的问题。
通过深入本文可以理解代码原理,进行代码文档的下载,也可以查看相应 Demo 部署效果。

前言

最近遇到很有意思转换二进制的问题,有部分童鞋俨然已了解,可能也有一部分童鞋没碰到过也就不知情,这里我们来深入学习下转换二进制所带来的问题。

二进制转换问题

假设现在我们有一个int类型的数据,它的范围区间暂且定在0-15之间,我们需要将其转换为二进制,然后获取二进制中的每一位,若不足4位则0填充。看似很简单是不是,直接通过C#内置APi即可达到此需求,如下:

 var binary = Convert.ToString(7, 2).PadLeft(4, '0').ToArray();

上述将数字7转换为包含二进制位的字符串数组形式,7转换二进制然后不足4位以0填充即(0111),我们如下获取二进制位字符串数组为索引的位,结果应该打印出0,对吗?

var zerobit = binary[0]; Console.WriteLine(zerobit);

 C#由转换二进制所引起的思考,了解下?

好像一点毛病也没有,这是在控制台中进行打印,若是将该数据导出到Excel中,你会发现结果将可能是48或49而不是0或1(你可以一试)这是因为如下:

C#由转换二进制所引起的思考,了解下?

我们通过调试可知实际上在字符0上还携带有48,这个48实际上是字符0的ASCII码,字符1的ASCII码是49,通过如下代码即可证明:

foreach (var b in System.Text.Encoding.UTF8.GetBytes(binary)) {     Console.WriteLine(b.ToString()); }

C#由转换二进制所引起的思考,了解下?

C#由转换二进制所引起的思考,了解下?

我们对将对应字符数组索引数据进行如下ToString转换即可避免导出数据时可能出现的问题

var zerobit = binary[0]; Console.WriteLine(zerobit.ToString());

转换字符数组问题

当我们转换为字符数组时,有两种方式,既可采用上述ToArray方法,也可以通过ToCharArray方法来实现,如下,那么哪种方法会更好呢?

var binary = Convert.ToString(7, 2).PadLeft(4, '0').ToArray();  var binary1 = Convert.ToString(7, 2).PadLeft(4, '0').ToCharArray();

此时比较此二者方法的性能好坏,只能去看对应源码实现,首先我们来看看ToCharArray方法,如下:

public unsafe char[] ToCharArray() {     if (Length == 0)     {         return Array.Empty<char>();     }     char[] array = new char[Length];     fixed (char* smem = &_firstChar)     {         fixed (char* dmem = &array[0])         {             wstrcpy(dmem, smem, Length);         }     }     return array; }

internal unsafe static void wstrcpy(char* dmem, char* smem, int charCount) {     Buffer.Memmove((byte*)dmem, (byte*)smem, (uint)(charCount * 2)); }

上述对于ToCharArray代码量还是不多,我们来看看ToArray方法实现,如下:

public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source) {     if (source == null)     {         throw Error.ArgumentNull("source");     }     return new Buffer<TSource>(source).ToArray(); }

上述只是写了一个扩展方法,我们继续往下看Buffer类的具体实现,如下:

internal Buffer(IEnumerable<TElement> source) {     TElement[] array = null;     int num = 0;     ICollection<TElement> collection = source as ICollection<TElement>;     if (collection != null)     {         num = collection.Count;         if (num > 0)         {             array = new TElement[num];             collection.CopyTo(array, 0);         }     }     else     {         foreach (TElement item in source)         {             if (array == null)             {                 array = new TElement[4];             }             else if (array.Length == num)             {                 TElement[] array2 = new TElement[checked(num * 2)];                 Array.Copy(array, 0, array2, 0, num);                 array = array2;             }             array[num] = item;             num++;         }     }     items = array;     count = num; }

从代码量上看就觉得ToArray方法实现稍微复杂一点,所以我们选择使用ToCharArray会更好,我要是如此草草结束此文,一定会喷。原归正传,我们一步步来分析,如上做了一点优化,首先会判断参数是否属于集合接口,若是则直接通过复制转换为数组形式,但是我们知道字符串肯定没有实现ICollection<T>接口,所以走另外一个条件分支,但是有的童鞋可能就有疑问了,此时为何可以遍历呢?那是因为针对字符实现了IEnumerable<char>接口,所以可以进行遍历,如下:

public sealed class CharEnumerator : IEnumerator, ICloneable, IEnumerator<char>, IDisposable {......}

接下来则是初始化容量为4的数组,为何这里为4呢?这里我认为应该谈不上优化,与其说是实现者的一种拍脑袋的想法,我倾向于理解为是一种权衡或考量,既然转到此分支说明一定是转换为二进制位的数组,比如上述进行填充后长度刚好为4。再接下来无用我再多讲,就是遍历所有字符数组,将每一个字符串添加到数组中去,直到数组长度和变量值(num)相等最终进行一次性复制,最终将数组赋值给数组元素以及将变量num赋值给数组元素的数量(count)。 

 

好了,讲解了这么多,那么问题来了,到底谁的性能会更好呢?ToCharArray方法实现底层采用指针操作转化为字符数组,而利用ToArray方法由于string没有实现ICollection<T>接口,也就是说根本不清楚字符串中字符数组的长度,所以只能采取低效遍历的方式去进行转换,我们可认为通过中间缓冲区的方式(即上述通过实例化数组作为桥梁最终进行复制)实现。由此得出,在将字符串转换为字符数组时,一定要用ToCharArray方法而不是ToArray,ToCharArray性能优于ToArray方法,我不禁在想,针对字符转换为数组只提供ToCharArray方法不就好了么,为何还要提供ToArray方法,让人容易产生误会,它的场景难道还有其他吗?

总结

本文详细讲解了在转换二进制数据所引发的一点个人思考,在将字符串转换为字符数组时,通过方法名称意思可能直接就用ToCharArray方法,但是又偏偏提供了字符串的ToArray方法,其本质是针对字符数组的扩展方法,如果对源码不了解的话,根本就不清楚到底应该用哪一个,从性能角度讲,ToCharArray方法优于ToArray方法,至于最终用哪一个,你说了算。

C#由转换二进制所引起的思考,了解下?资料部分资料来自网络,侵权毕设源码联系删除

区块链毕设网(www.qklbishe.com)全网最靠谱的原创区块链毕设代做网站
部分资料来自网络,侵权联系删除!
资源收费仅为搬运整理打赏费用,用户自愿支付 !
qklbishe.com区块链毕设代做网专注|以太坊fabric-计算机|java|毕业设计|代做平台 » C#由转换二进制所引起的思考,了解下?资料

提供最优质的资源集合

立即查看 了解详情