Как разделить массив байтов

brew install mysql

pip3 install mysql все еще дает ошибку «configparser», и я не знаю, почему это еще не исправлено.

30
задан Mark Amery 25 April 2017 в 17:36
поделиться

5 ответов

Вот как бы я это сделал:

using System;
using System.Collections;
using System.Collections.Generic;

class ArrayView<T> : IEnumerable<T>
{
    private readonly T[] array;
    private readonly int offset, count;

    public ArrayView(T[] array, int offset, int count)
    {
        this.array = array;
        this.offset = offset;
        this.count = count;
    }

    public int Length
    {
        get { return count; }
    }

    public T this[int index]
    {
        get
        {
            if (index < 0 || index >= this.count)
                throw new IndexOutOfRangeException();
            else
                return this.array[offset + index];
        }
        set
        {
            if (index < 0 || index >= this.count)
                throw new IndexOutOfRangeException();
            else
                this.array[offset + index] = value;
        }
    }

    public IEnumerator<T> GetEnumerator()
    {
        for (int i = offset; i < offset + count; i++)
            yield return array[i];
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        IEnumerator<T> enumerator = this.GetEnumerator();
        while (enumerator.MoveNext())
        {
            yield return enumerator.Current;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        byte[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
        ArrayView<byte> p1 = new ArrayView<byte>(arr, 0, 5);
        ArrayView<byte> p2 = new ArrayView<byte>(arr, 5, 5);
        Console.WriteLine("First array:");
        foreach (byte b in p1)
        {
            Console.Write(b);
        }
        Console.Write("\n");
        Console.WriteLine("Second array:");
        foreach (byte b in p2)
        {
            Console.Write(b);
        }
        Console.ReadKey();
    }
}
15
ответ дан Jon Skeet 27 November 2019 в 23:47
поделиться

В C # с Linq вы можете сделать это:

smallPortion = largeBytes.Take(4).ToArray();
largeBytes = largeBytes.Skip(4).Take(5).ToArray();

;)

19
ответ дан Alireza Naghizadeh 27 November 2019 в 23:47
поделиться

Я не уверен, что вы подразумеваете под:

Я хотел бы разбить массив байтов в определенной точке (индекс) без необходимости просто создавать новый массив байтов и копировать каждый байт одновременно увеличивая отпечаток в памяти операции.

В большинстве языков, конечно же, C #, после выделения массива невозможно изменить его размер. Похоже, вы ищете способ изменить длину массива, что вы не можете. Вы также хотите каким-то образом перезапустить память для второй части массива, чтобы создать второй массив, чего вы также не можете сделать.

В итоге: просто создайте новый массив.

1
ответ дан Outlaw Programmer 27 November 2019 в 23:47
поделиться

Вы не можете. То, что вы могли бы хотеть, это сохранить отправную точку и количество предметов; по сути, строить итераторы. Если это C ++, вы можете просто использовать std::vector<int> и использовать встроенные.

В C # я бы создал небольшой класс итераторов, который содержит начальный индекс, счетчик и реализует IEnumerable<>.

0
ответ дан Donald Duck 27 November 2019 в 23:47
поделиться

FYI. Структура System.ArraySegment в основном аналогична структуре ArrayView в приведенном выше коде. Вы можете использовать эту нестандартную структуру таким же образом, если хотите.

20
ответ дан 27 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: