Как читать двоичные фрагменты из файла в обратном порядке? - PullRequest
0 голосов
/ 02 декабря 2018

Мне нужен алгоритм для чтения двоичного файла и сжатого массива с чанками в обратном порядке.например:

Input binary data: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Chunk size: 4
Result: {13 14 15 16} {9 10 11 12} {5 6 7 8} {1 2 3 4}

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Это не очень хороший вопрос, поскольку вы не показываете некоторые усилия со своей стороны.

Но, как вы добавили [kotlin], это просто написать на Kotlin:

val input = byteArrayOf( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 )
val result = input.asList().chunked(4).reversed()

(Обратите внимание, что это решение не очень хорошо для потребления памяти в JVM, но это можно решить, оптимизировав встроенную функцию chunked для байтовых массивов.

0 голосов
/ 02 декабря 2018

Подход Linq (неэффективен из-за GroupBy & Reverse, но я предпочитаю Linq вне зависимости):

byte[] bytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };

int chunkSize = 4;

var chunkedBytes = bytes.Select((x, i) => new { Index = i, Value = x })
                        .GroupBy(i => i.Index / chunkSize)
                        .Select(i => i.Select(j => j.Value))
                        .Reverse().ToList();

Использование устаревших циклов:

byte[] bytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };

int chunkSize = 4;

var chunkedBytes = new List<byte[]>();

int offset = bytes.Length % chunkSize;
for (int i = bytes.Length - 1; i >= 0; i -= chunkSize)
{
    byte[] tempBytes = new byte[i < chunkSize - 1 ? offset : chunkSize];
    int index = 0;

    for (int j = tempBytes.Length - 1; j >= 0; j--)
        tempBytes[index++] = bytes[i - j];

    chunkedBytes.Add(tempBytes);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...