arrays - 字节数组随机分布到一个字节数组中
问题描述
我现在需要面对的问题是我有一定数量的不同大小的字节数组。我想将它们放入一个比所有其他字节数组大得多的单个字节数组中,以便在这个没有放入任何字节的大字节数组内部出现空洞。
字节数组随机分布在大字节数组上,但没有字节数组可能与已经放置在那里的另一个字节数组发生冲突。是否有一个有效的为什么要在没有冲突的情况下进行这种随机分布?
解决方案
具有以下功能:
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.....
这个想法是首先通过从图像大小中减去文件的总大小来计算可用空间,然后通过在可用空间中选择随机位置(我称之为“间隙位置”)来随机分割可用空间。间隙位置之间的增量会成为文件之间的间隙,因此当我们将文件复制到图像中时,我们会跳过相应的间隙增量,然后再将文件放在最后一个文件的末尾。
推荐阅读
- php - 准备好声明来检查关注者是否已经关注关注者?
- java - 跨多个服务器的 Tomcat Websockets
- vue.js - 路由器上的 Vue 过渡 - 但过渡效果特定于 html 元素
- python - 如何按天创建平均值?
- pandas - 熊猫 | 应用to_json时添加根节点
- angular - Angular:Google Analytics gtag.js 的 Document.write
- python - 使用 CustomUser 模型添加和删除好友
- python - StepLR Learning Rate Scheduler 应用几乎无限小的下降,而且还为时过早
- ansible - 可以将数值存储在寄存器变量中并检查条件语句
- node.js - require.cache 在 require 之前不为空