scala - 无法证明 Long :: String :: Option[Long] :: Option[java.util.UUID] :: shapeless.HNil 可以与 SimpleMp4BoxHeader 相互转换
问题描述
我是一名初学者,正在处理 MP4 文件解码。当我编写如下代码时,它报告“无法证明 Long :: String :: Option[Long] :: Option[java.util.UUID] :: shapeless.HNil可以转换为/从 SimpleMp4BoxHeader"。我该如何解决这个问题?
sealed trait Mp4BoxHeader {
def size: Int
def btype: String
}
case class SimpleMp4BoxHeader(size: Int, btype: String) extends Mp4BoxHeader
object SimpleMp4BoxHeader {
// val scodec = uint32 ~ ascii32
def apply(size: Int, btype: String): SimpleMp4BoxHeader = SimpleMp4BoxHeader(size, btype)
implicit def codec: Codec[SimpleMp4BoxHeader] = "simpleMp4BoxHeader" | { ("size" | uint32 ) :: ("btype" | ascii32) }.as[SimpleMp4BoxHeader]
}
解决方案
这是因为uint32
isCodec
用于Long
类型,但您的size
is 应该是Int
,看看scodec.codecs
包对象:
/**
* Codec for 16-bit unsigned big-endian integers.
* @group numbers
*/
val uint16: Codec[Int] = new IntCodec(16, false, ByteOrdering.BigEndian)
/**
* Codec for 24-bit unsigned big-endian integers.
* @group numbers
*/
val uint24: Codec[Int] = new IntCodec(24, false, ByteOrdering.BigEndian)
/**
* Codec for 32-bit unsigned big-endian integers.
* @group numbers
*/
val uint32: Codec[Long] = new LongCodec(32, false, ByteOrdering.BigEndian)
您应该选择一些最兼容的编解码器Codec
(Int
或uint24
)uint16
,替换uint32
为选择的,您的代码将编译。
推荐阅读
- dns - Active Diretory domain name same as site
- asp.net - ASP.NET CORE 5 MVC How To Add A New Category Directly From The Site
- javascript - How to use drag and drop between panel to panel in extJS
- jenkins - trigger URL jenkins button rebuild from command line
- azure-data-factory - Azure data factory window function last non-null value
- sql - Select on rows with latest date in a table with no groups
- python - Send_keys to a textarea jsname in Python Selenium
- vue.js - Vue. How to pass a variable I have on server (process.env.SERVER) to the browser
- python - 查找数组 B 中与数组 A 中的元素最匹配的元素的索引
- python - pymodbus 如何通过真实的串行端口测试我的串行 RTU 服务器