[英]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.