如何以相反的顺序从文件中读取二进制块?

时间:2018-12-02 19:33:50

标签: java c# algorithm data-structures kotlin

我需要算法来以相反的顺序读取二进制文件和带有大块的压缩数组。 例如:

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 :(得分:4)

Linq方法(由于GroupByReverse而效率低下,但无论如何,我还是更喜欢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);
}

答案 1 :(得分:2)

这不是一个大问题,因为您没有表现出自己的努力。

但是正如您添加的[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函数来解决。