繁体   English   中英

Scodec:将vectorOfN与vlong字段一起使用

[英]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的VectorGenSeqLike的子类型,限于具有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM