首页 > 解决方案 > 字节数组随机分布到一个字节数组中

问题描述

我现在需要面对的问题是我有一定数量的不同大小的字节数组。我想将它们放入一个比所有其他字节数组大得多的单个字节数组中,以便在这个没有放入任何字节的大字节数组内部出现空洞。

字节数组随机分布在大字节数组上,但没有字节数组可能与已经放置在那里的另一个字节数组发生冲突。是否有一个有效的为什么要在没有冲突的情况下进行这种随机分布?

标签: arrayspython-3.xbyte

解决方案


具有以下功能:

from random import randint, shuffle
import itertools
import operator

def random_distribution(image, files):
    shuffle(files)
    available_size = len(image) - sum(map(len, files))
    gap_positions = sorted([randint(0, available_size) for i in range(len(files))])
    gap_deltas = itertools.starmap(operator.sub, zip(gap_positions, [0] + gap_positions))
    position = 0
    for file, gap_delta in zip(files, gap_deltas):
        position += gap_delta
        image[position : position + len(file)] = file
        position += len(file)
    return image

我们将 3 个文件随机分配到一个 20 字节的图像中 10 次:

>>> files = ['abc', '1234', 'ABCDE']
>>> for i in range(10):
...     print(random_distribution(bytearray(20), files).replace('\x00', '.'))
...
.abc.1234...ABCDE...
..ABCDE.abc....1234.
abcABCDE......1234..
..1234...ABCDE...abc
..1234.....abc.ABCDE
...abc.1234..ABCDE..
abc...ABCDE....1234.
.ABCDE..abc1234.....
....ABCDE..1234.abc.
1234..ABCDE.abc.....

这个想法是首先通过从图像大小中减去文件的总大小来计算可用空间,然后通过在可用空间中选择随机位置(我称之为“间隙位置”)来随机分割可用空间。间隙位置之间的增量会成为文件之间的间隙,因此当我们将文件复制到图像中时,我们会跳过相应的间隙增量,然后再将文件放在最后一个文件的末尾。


推荐阅读