Проблемы с C# ArraySegment - PullRequest
1 голос
/ 01 мая 2020

У меня есть массив всех байтов в файле.

{ 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.");
    }

возвращает «Не соответствует» вместо «Соответствует». Я также пытался сравнить каждый элемент массива в строке, но это также не работает. Выводить их в виде строки так:

Console.WriteLine(startup[0]);
Console.WriteLine(startup[1]);
Console.WriteLine(startup[2]);
Console.WriteLine(startup[3]);

возвращается, как и ожидалось:

160
0
255
255

Я действительно не уверен, что не так, и любая помощь будет принята с благодарностью. Большое спасибо!

1 Ответ

1 голос
/ 01 мая 2020

В дополнение к моему комментарию выше, здесь есть реализация метода, который вы можете использовать для сравнения массивов.

    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]);
    }

Использование == для сравнения двух массивов возвращает false в вашем случае, потому что это оператор проверяет, являются ли оба массива одним и тем же экземпляром, сравнивая их ссылку, как Мар c Гравелл уже указал в своем комментарии.

...