scala - 使用编解码器限制大小字节后如何忽略编解码器
问题描述
我将为使用 TTLV 编码(标记、类型、长度、值)的 KMIP 协议创建一个模型
该ttlv
函数是“高级”并接受值的标记、类型和编解码器。
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]
)将编解码器转换为case class
只有 value的 a A
。如何忽略uint32
after used by limitedSizeBytes
?否则,我有兴趣就更好的方法发表评论。
以下是case class
示例:
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
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)
最后的编解码器:
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]
要编码的对象示例:
val m = RequestMessage(
RequestHeader(14),
RequestPayload(
CompromiseDate(8),
CertificateName("certificate name")
)
)
解决方案:
variableSizeBytesLong
在这里做我想做的事:
def ttlv[A<:HList](tag:ByteVector, itype:ByteVector, value: Codec[A]): Codec[A] =
(constant(tag) :~>: constant(itype) :~>: variableSizeBytesLong(uint32, value))
解决方案
尝试
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 :: _)
推荐阅读
- python - 我想为 Django 项目创建一个虚拟环境,但是当我执行 pip install Django 时,它说要求已经满足
- python - 带有 Selenium Python 的自动电报媒体按钮
- listview - Xamarin ListView 不显示内容
- instantiation - 重采样是否必须在 mlr3 中实例化?
- javascript - 使用 Google Cloud Tasks 安排云功能时出现 JSON 错误中的意外令牌“
- node.js - Mongoose 按日期和值聚合
- python - JSONDecodeError 跳过
- firebase - 当应用程序正在运行并且链接已被使用时,颤动动态链接导航失败
- dax - 如何在 Dax 中获取 DateTime 差异?
- awk - 使用 m4,esyscmd awk 命令给出“没有这样的文件或目录”