[英]Scodec: Using vectorOfN with a vlong field
我在玩比特币区块链学习Scala和一些有用的库。 目前,我正在尝试使用SCodec解码和编码块,而我的问题是vectorOfN函数将其大小视为Int。 如何在保留整个值范围的同时使用长字段表示大小。 换句话说,是否有vectorOfLongN函数?
这是我的代码,如果我使用vintL而不是vlongL可以很好地编译:
object Block {
implicit val codec: Codec[Block] = {
("header" | Codec[BlockHeader]) ::
(("numTx" | vlongL) >>:~
{ numTx => ("transactions" | vectorOfN(provide(numTx), Codec[Transaction]) ).hlist })
}.as[Block]
}
您可以假定已为Blockheader和事务实现了适当的编解码器。 实际上,vlong可以简化该问题,因为比特币将自己的编解码器用于可变大小的整数。
我不是scodec专家,但我的常识表明这是不可能的,因为Scala的Vector
是GenSeqLike
的子类型,限于具有Int
类型的length
,并且apply
接受Int
索引作为其参数。 而且AFAIU这个限制来自底层的JVM平台,在该平台上,数组的大小不能超过Integer.MAX_VALUE
即大约2 ^ 31(另请参见“ Java的批判”维基 )。 并且尽管Vector
理论上可以解决此限制,但是并没有做到。 因此, vectorOfN
不能支持Long
size。
换句话说,如果您想要这样的东西,您可能应该从创建自己的类似Vector的类开始,该类确实支持围绕JVM限制的Long
索引。
您可能想看一下scodec-stream ,当所有数据都不立即可用或不适合内存时,它会派上用场。
基本上,您将使用常规的codecs.X
并通过scodec.stream.decode.many(normal_codec)
将其转换为StreamDecoder
。 这样,您可以通过scodec
数据,而无需将其完全加载到内存中。
一个StreamDecoder
然后提供类似的方法decodeInputStream
沿scodec's
通常的decode
。
(前一阵子我在一个稍有不同的上下文中使用了它-解析客户端发送到服务器的数据-但看起来它也适用于此)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.