欢迎访问欧博亚洲(Allbet Game)!

首页科技正文

allbet登陆网址:C#由转换二进制所引起的思索,了解下?

admin2020-07-0247

前言

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

二进制转换问题

假设现在我们有一个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);

 

似乎一点偏差也没有,这是在控制台中举行打印,若是将该数据导出到Excel中,你会发现效果将可能是48或49而不是0或1(你可以一试)这是由于如下:

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

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

allbet登陆网址:C#由转换二进制所引起的思索,了解下? 第1张

我们对将对应字符数组索引数据举行如下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方式,至于最终用哪一个,你说了算。

,

欧博APP

欢迎进入欧博APP(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源:欧博亚洲(Allbet Game)!

本文链接:http://www.zbguandaobeng.com/post/1301.html

网友评论

最新评论

  • UG环球官网 09/24 说:

    欧博亚洲官网开户网址欢迎进入欧博亚洲官网开户网址(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。姐妹们快看神仙

  • UG环球官网 09/24 说:

    欧博亚洲官网开户网址欢迎进入欧博亚洲官网开户网址(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。姐妹们快看神仙

  • 环球UG官方网 09/23 说:

    联博统计接口www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。就是很好,谁损也没用

  • 环球UG充值 09/23 说:

    欧博app下载欢迎进入欧博app下载网站:www.aLLbetgame.us,欧博app下载网站是欧博官方网站。欧博app下载网站开放欧博注册、欧博代理、欧博电脑客户端、欧博app下载等业务。哈哈,我是死忠粉

  • Usappledeveloperaccountsforsale 09/23 说:

    欧博亚洲客户端欢迎进入欧博亚洲客户端(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。一直在看哦

  • 欧博电脑版 09/22 说:

    联博统计接口www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。有看点,中意

  • AllbetGmaing官网 09/22 说:

    欧博开户欢迎进入欧博开户平台(Allbet Game):www.aLLbetgame.us,欧博开户平台开放欧博Allbet开户、欧博Allbet代理开户、欧博Allbet电脑客户端、欧博AllbetAPP下载等业务。喜欢晚上看

  • UG环球电脑版下载 09/21 说:

    apple developer enterprise account for rentproviding apple enterprise developer accounts for rent, rent your own enterprise account for app signing. with high quality, stable performance and affordable price.累了的时候看这个