首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用Codec限制大小字节后忽略它

如何在使用Codec限制大小字节后忽略它
EN

Stack Overflow用户
提问于 2018-10-08 08:48:41
回答 1查看 144关注 0票数 0

我将为使用TTLV编码(标签,类型,长度,值)的KMIP协议创建一个模型。

ttlv函数是“高级”函数,接受该值的标记、类型和编解码器。

代码语言:javascript
复制
 def ttlv[A<:HList](tag:ByteVector, itype:ByteVector, value: Codec[A]) =
   constant(tag) :: constant(itype) :: 
   (uint32 >>:~ {
     case length => limitedSizeBytes(length, value)
   })

结果是一个Codec[Unit :: Unit :: Long :: A]。但是,我需要一个Codec[Unit :: Unit :: Unit :: A] (或Codec[A])将编解码器转换为只有值Acase class。如何在被uint32使用后忽略limitedSizeBytes?否则,我有兴趣就更好的办法发表意见。

下面是case class示例:

代码语言:javascript
复制
case class RequestHeader(protocol:Int)
case class RequestPayload(payload:CompromiseDate, name:CertificateName)
case class RequestMessage(header:RequestHeader, payload: RequestPayload)
case class CompromiseDate(value:Int)
case class CertificateName(value:String)

更高级别的函数,如ttlvStructure

代码语言:javascript
复制
def ttlvStructure[A<:HList](tag:ByteVector, struct:Codec[A]) =
  ttlv(tag, hex"01", struct)
def ttlvTextString(tag:ByteVector) =
  ttlv(tag, hex"07", utf8.hlist)
def ttlvInt(tag:ByteVector) =
  ttlv(tag, hex"02", int32.hlist)

最后的编解码器:

代码语言:javascript
复制
implicit val certificateNameCodec =
  ttlvTextString(hex"420020").as[CertificateName]

implicit val compromiseDateCodec =
  ttlvInt(hex"420021").as[CompromiseDate]

implicit val requestPayloadCodec =
  ttlvStructure(hex"420003", Codec[CompromiseDate] :: Codec[CertificateName]).as[RequestPayload]

implicit val requestHeaderCodec =
  ttlvInt(hex"420002").as[RequestHeader]

implicit val requestMessageCodec =
  ttlvStructure(hex"420001", Codec[RequestHeader] :: Codec[RequestPayload]).as[RequestMessage]

要编码的对象示例:

代码语言:javascript
复制
val m = RequestMessage(
      RequestHeader(14),
      RequestPayload(
        CompromiseDate(8),
        CertificateName("certificate name")
      )
    )

溶液

variableSizeBytesLong来这里做我想做的事:

代码语言:javascript
复制
def ttlv[A<:HList](tag:ByteVector, itype:ByteVector, value: Codec[A]): Codec[A] =
    (constant(tag) :~>: constant(itype) :~>: variableSizeBytesLong(uint32, value))
EN

回答 1

Stack Overflow用户

发布于 2018-10-08 11:17:04

试一试

代码语言:javascript
复制
val defaultLength: Long = ???

def ttlv[A<:HList](tag:ByteVector, itype:ByteVector, value: Codec[A]): Codec[A] =
  constant(tag) :~>: constant(itype) :~>:
    (uint32 >>:~ (length => limitedSizeBytes(length, value))).xmap[A](_.tail, defaultLength :: _)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52698562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档