Ruby:我可以用Ruby将数字输入转换为固定大小的字节数组吗



我对ruby word很陌生,在以前的公司里我做过很多java。条件是我想创建一个固定大小的文件。我的想法是创建一个字节数组,并填充输入数量的元素。例如,如果我想创建一个2GB的文件,它会在Byte数组中填充2M个项目(数组大小为4M(。我可以通过使用长值作为输入来实现它,并执行>gt;或者<lt;以帮助我填充字节数组并使用元素来验证创建的文件。

key[0] = (byte) 1;
key[1] = (byte) (i >> 24 & 0xFF);
key[2] = (byte) (i >> 16 & 0xFF);
key[3] = (byte) (i >> 8 & 0xFF);
key[4] = (byte) (i & 0xFF);  

但在ruby中,由于它是动态的,我在这里遇到了一个阻塞器,我正在考虑使用24字节数组来模拟长变量,我知道这有点复杂,但还有其他更好的选择吗?非常感谢。提前感谢!

模拟固定长度数组的内存方法

我可能误解了你想要做的,但在设计上Ruby不允许你为Array之类的东西设置固定的大小。你可能得到的最接近的方法是分配,然后截断以适应。

作为一个基本的例子,让我们假设我想要一个5个元素的循环缓冲区,而我从来都不想"生长";除此之外。我可以做:

CIRCULAR_BUFFER_SIZE = 5
circular_buffer = [0, 1, 2, 3, 4]
circular_buffer.push 5, 6, 7
#=> [0, 1, 2, 3, 4, 5, 6, 7]
if circular_buffer.size > CIRCULAR_BUFFER_SIZE
circular_buffer.shift(
circular_buffer.size - CIRCULAR_BUFFER_SIZE
)
end
circular_buffer
#=> [3, 4, 5, 6, 7]

最终,您可以将其转换为自定义类或Array的后代,在调用#push、#append、#<lt#shift、#unshift或#[]=。

在写入磁盘时,您可以在打包之前如上所述截断Array。或者,如果您将文件写入LIFO,您可以先写入StringIO对象,将其截断为调用file#truncate,然后正常写入磁盘。如果目标只是避免向磁盘写入超过n个字节,那么两者都应该有效。

最新更新