热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:C#字节数组比较分享

C#字节数组比较我使用.NET3.0在C#中有两个字节数组。比较两个字节数组是否包含每个元素的相同内容的“最有效”方法是什么?例如,字节数组{0x1,0x2}与{0x1,0x2}。

C#字节数组比较

我使用.NET 3.0在C#中有两个字节数组。

比较两个字节数组是否包含每个元素的相同内容的“最有效”方法是什么?

例如,字节数组{0x1, 0x2}{0x1, 0x2} 。 但字节数组{0x1, 0x2}和字节数组{0x2, 0x1}不相同。

好吧,你可以使用:

 public static bool ByteArraysEqual(byte[] b1, byte[] b2) { if (b1 == b2) return true; if (b1 == null || b2 == null) return false; if (b1.Length != b2.Length) return false; for (int i=0; i  

(我通常会使用大括号来表示所有内容,但我认为我只是为了改变而尝试这种布局样式......)

这有一些优化, SequenceEqual不能(或不执行) - 例如前期长度检查。 直接arrays访问也比使用枚举器更有效。

不可否认,在大多数情况下不太可能产生显着差异......

你可以通过一次比较32位或64位而不是8位来使非托管代码中的速度更快 - 但我不想在运行时编写代码。

您可以使用SequenceEqual方法:

 bool areEqual = firstArray.SequenceEqual(secondArray); 

正如评论中所提到的, SequenceEqual需要.NET 3.5(如果您正在使用VS2008并且针对早期版本的框架,则需要LINQBridge )。

Jon提到使用不安全的代码一次比较多个字节,所以我不得不试一试:

 public unsafe bool ByteArraysEqual(byte[] b1, byte[] b2) { if (b1 == b2) return true; if (b1 == null || b2 == null) return false; if (b1.Length != b2.Length) return false; int len = b1.Length; fixed (byte* p1 = b1, p2 = b2) { int* i1 = (int*)p1; int* i2 = (int*)p2; while (len >= 4) { if (*i1 != *i2) return false; i1++; i2++; len -= 4; } byte* c1 = (byte*)i1; byte* c2 = (byte*)i2; while (len > 0) { if (*c1 != *c2) return false; c1++; c2++; len--; } } return true; } 

安全代码得到了相当优化(例如,编译器知道它不必检查索引边界),所以我不希望不安全代码更快。 任何显着差异都来自同时比较几个字节的能力。

如果你想要它真的很快,你可以使用不安全的代码(这并不总是可行):

  public static bool ArraysEqual(byte[] b1, byte[] b2) { unsafe { if (b1.Length != b2.Length) return false; int n = b1.Length; fixed (byte *p1 = b1, p2 = b2) { byte *ptr1 = p1; byte *ptr2 = p2; while (n-- > 0) { if (*ptr1++ != *ptr2++) return false; } } return true; } } 

如果您不太关心性能,可以考虑IStructuralEquatable

.NET Framework受以下版本支持:4.5,4

结构相等意味着两个对象是相等的,因为它们具有相等的值。 它与参考平等不同。

例:

 static bool ByteArrayCompare(byte[] a1, byte[] a2) { IStructuralEquatable eqa1 = a1; return eqa1.Equals(a2, StructuralComparisons.StructuralEqualityComparer); } 

参考

上述就是C#学习教程:C#字节数组比较分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---编程笔记

  1. IStructuralEquatable和IStructuralComparable解决了什么问题?
  2. 为什么IStructuralEquatable和IStructuralComparable不通用?
  3. IStructuralEquatable接口


推荐阅读
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
author-avatar
韩志勇1234
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有