C# ArraySegment 的问题
Problems with C# ArraySegment
我有一个文件中所有字节的数组。
{ 0xA0, 0x00, 0xFF, 0xFF, 0xA0, 0x10, 0x01, 0x00, 0x10, 0x32, 0x0D, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x77, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6C, 0x00, 0x64, 0x00, 0x21, 0x00, 0xF0, 0xF0 }
我还有一个功能,可以读取文件的某个部分,并将位置向前移动。 (类似于 BinaryReader.ReadX()
除了在数组中。
private static byte[] readBytes(int length)
{
cursorLocation += length;
return new ArraySegment<byte>(bytes, cursorLocation-length, length).ToArray();
}
但是,当我尝试测试某段字节是否相同时,似乎不起作用。例如,这个:
byte[] startup = readBytes(4);
if (startup == new byte[] { 0xA0, 0x00, 0xFF, 0xFF })
{
Console.WriteLine("Matches");
} else
{
Console.WriteLine("Does not match.");
}
returns "Does Not Match," 而不是 "Matches." 我也尝试连续比较每个数组片段,但这也不起作用。像这样在一行中打印出来:
Console.WriteLine(startup[0]);
Console.WriteLine(startup[1]);
Console.WriteLine(startup[2]);
Console.WriteLine(startup[3]);
returns,符合预期:
160
0
255
255
我真的不确定哪里出了问题,如有任何帮助,我们将不胜感激。非常感谢!
除了我上面的评论之外,这里还有一个可用于比较数组的方法的实现。
private static bool AreByteArraysEqual(byte[] expected, byte[] actual)
{
return expected != null
&& actual != null
&& expected.Length == actual.Length
&& Enumerable.Range(0, actual.Length - 1)
.All(i => expected[i] == actual[i]);
}
使用 == 比较两个数组 returns 在您的情况下为 false,因为此运算符通过比较它们的引用来检查两个数组是否是完全相同的实例,正如 Marc Gravell 已经在他的评论中指出的那样。
更新:
我的回答中有一条评论指出已经有一个 Linq 方法“SequenceEqual”可以逐个元素地比较集合.
我有一个文件中所有字节的数组。
{ 0xA0, 0x00, 0xFF, 0xFF, 0xA0, 0x10, 0x01, 0x00, 0x10, 0x32, 0x0D, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x77, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6C, 0x00, 0x64, 0x00, 0x21, 0x00, 0xF0, 0xF0 }
我还有一个功能,可以读取文件的某个部分,并将位置向前移动。 (类似于 BinaryReader.ReadX()
除了在数组中。
private static byte[] readBytes(int length)
{
cursorLocation += length;
return new ArraySegment<byte>(bytes, cursorLocation-length, length).ToArray();
}
但是,当我尝试测试某段字节是否相同时,似乎不起作用。例如,这个:
byte[] startup = readBytes(4);
if (startup == new byte[] { 0xA0, 0x00, 0xFF, 0xFF })
{
Console.WriteLine("Matches");
} else
{
Console.WriteLine("Does not match.");
}
returns "Does Not Match," 而不是 "Matches." 我也尝试连续比较每个数组片段,但这也不起作用。像这样在一行中打印出来:
Console.WriteLine(startup[0]);
Console.WriteLine(startup[1]);
Console.WriteLine(startup[2]);
Console.WriteLine(startup[3]);
returns,符合预期:
160
0
255
255
我真的不确定哪里出了问题,如有任何帮助,我们将不胜感激。非常感谢!
除了我上面的评论之外,这里还有一个可用于比较数组的方法的实现。
private static bool AreByteArraysEqual(byte[] expected, byte[] actual)
{
return expected != null
&& actual != null
&& expected.Length == actual.Length
&& Enumerable.Range(0, actual.Length - 1)
.All(i => expected[i] == actual[i]);
}
使用 == 比较两个数组 returns 在您的情况下为 false,因为此运算符通过比较它们的引用来检查两个数组是否是完全相同的实例,正如 Marc Gravell 已经在他的评论中指出的那样。
更新:
我的回答中有一条评论指出已经有一个 Linq 方法“SequenceEqual”可以逐个元素地比较集合.