存在符合以下协议的二进制文件
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"));
}
}