我正在使用 scodec:https ://github.com/scodec/scodec来解码/编码二进制协议。
我正在努力处理规范的一部分,其中“长度”字段被“moreflag”分成两部分。moreflag 指示长度字段是否需要更多空间。
Example:
Byte 1: identifier bits 8-7, moreFlag bit 6, length bits 5-0 // first length field filled with 0's if moreFlag is false
Byte 2: moreFlag bit 8, length bits 7-0
Byte 3: otherJunk bits 8-0
我的问题是我想将这两个长度字段编码/解码为单个案例类字段:
case class Header(totalLength: Int, otherJunk: Int)
我尝试了一些不同的东西,但到目前为止没有任何结果:
implicit val headerCodec: Codec[Header] = (
("identifier" | uint2) :~>:
("moreFlag" | bool).compact >>:~ { meta =>
if (meta.last) {
// more flag enabled, combine lengths somehow
("first length part" | uint(5)) :: ("moreFlag2DontCare" | uint(1) :~>: ("second length part - how to combine?" | uint(7)) :: ("otherJunk" | uint8)
}
else {
("first length part always 0s" | constant(bin"00000")) :: ("moreFlag2DontCare" | uint(1) :~>: ("fullLength" | uint(7)) :: ("otherJunk" | uint8)
}
}
).as[Header]
我在正确的轨道上吗?谢谢!