C# 用BitArray 实现解析协议时的二进制比较

存在符合以下协议的二进制文件


image.png

可以把协议里的头类型信息转换成字符串来比较(读取固定长度的字节,转换成字符串,查看是否为“##DT”)
下面的方法则直接读取二进制的形式头类型信息,然后和“##DT”的二进制形式进行比较(这里只是进行一下测试,合适与否要看实际的应用)

public static void Main()
        {
            MakeBinaryFile();
            CompareBitArray();
            Console.ReadLine();
        }        

      private static void CompareBitArray()
        {
            BitArray b1 = GetFileBitArray(@"D:\C");
            BitArray b2 = new BitArray(System.Text.Encoding.Default.GetBytes("##DT"));

            b1.Xor(b2).Not();//异或操作 然后 非操作

            bool allTrue = IsBitArrayAllTrue(b1);
            if (allTrue)
            {
                Console.WriteLine("两段二进制相等");
            }
        }
        private static bool IsBitArrayAllTrue(IEnumerable myArray)
        {
            bool result = true;
            foreach (var item in myArray)
            {
                if (!(bool)item)
                {
                    result = false;
                    break;
                }
            }
            return result;
        }
        private static BitArray GetFileBitArray(string path)
        {
            FileStream fileStream = new FileStream(path, FileMode.Open);
            BinaryReader binaryReader = new BinaryReader(fileStream);
            long length = fileStream.Length;
            byte[] bytes = new byte[length];
            binaryReader.Read(bytes, 0, bytes.Length);
            //byte[] content = new byte[1];
            //content[0] = bytes[3];
            return new BitArray(bytes);
        }
        private static void MakeBinaryFile()
        {
            using (BinaryWriter bw = new BinaryWriter(new FileStream(@"D:\C", FileMode.Create)))
            {
                //string s = "##DT";
                //bw.Write(s);
                //直接写入字符串,二进制里会多一或者两个字节,表示string的长度,叫长度前缀(length - prefixed)
                //这是供BinaryReader的ReadString方法用,知道长度,它才知道要读取到哪里。                
                //要写入干净的string二进制,需要转成byte[]
                bw.Write(System.Text.Encoding.Default.GetBytes("##DT"));
            }
        }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容