问题标签 [scodec]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
311 浏览

scala - scodec variableSizePrefixBytes 转换

我有一个用例,其中标头可以包含 7 个字节加上可选的 0-15 字节信息,其中大小信息位于第 5 个字节的低 4 位,因此格式为:

我在下面的案例类中对此进行了建模

在这种情况下,根据 scala 文档,我可以使用该variableSizePrefixedBytes方法对大小和额外字节之间的 2 个额外字节进行建模。

但是我做错了,因为编译器无法证明这个编解码器可以转换为/从FHDR类转换,我已经盯着这个看了一段时间了,但我一无所知

0 投票
1 回答
609 浏览

scala - Scodec 组合器:标头包含用于区分类型的幻数

我正在寻找一种方法来处理类似于以下示例的协议:

在这里,bodyType == 0将代表ReadbodyType != 0并将编码Write。请注意,有几个字段将鉴别器与鉴别值分开。

我看过一个 byte-ordering 的例子。但据我了解,这种“鱿鱼”编码的鉴别器不会往返。解决此类问题的正确方法是什么?

0 投票
1 回答
291 浏览

scala - 展平任意嵌套的编解码器?

作为 SCodec 的新用户,学习曲线相当长。尽管阅读了源代码和文档,但我遇到了一个似乎无法解决的问题。

我希望能够将流行的编解码器定义为这样的功能

然后将它们组合到像这样的更高级别的编解码器中,这些编解码器在这样的案例类中解码和编码

但是,这不起作用说

无法证明 shapeless.::[Boolean,shapeless.::[shapeless.::[Int,shapeless.::[Int,shapeless.::[Int,shapeless.HNil]]],shapeless.::[Boolean ,shapeless.HNil]]] 可以与 cmd504.MyPacket 相互转换。

然而,当我“内联”时packedByte,就像

一切都按预期编译和工作。我的直觉告诉我必须将编解码器“展平”(基于错误消息中的两个 HNil),但我无法展平编解码器本身或内部 HList 表示。

0 投票
1 回答
121 浏览

scodec - 编解码器的模式是数据流的一部分

我目前正在评估 scodec 是否适合我的任务。我必须解析一个结构如下的 InputStream(文件或网络):

这意味着流以一些元数据开始,这些元数据描述了接下来的内容。每个元素由一个分隔符 ( -) 分隔,该分隔符标识它是什么类型。N 个字段描述包含 N 条记录中每条记录的结构和大小的信息。

我很容易解析标题以及字段序列,因为我能够制定一个在编译时已知的编解码器。但是由于字段描述中的信息,我有点困惑如何在运行时构建编解码器。

那可能吗?如果是的话,也许你可以给我举个例子?

0 投票
0 回答
153 浏览

scala - 解码未对齐值后的字节对齐BitVector

我遇到了一个关于 scodec 的有趣问题。我有一个特殊的编码方案,当当前位指针 mod 8 不为零(未与最近的字节对齐)时,它需要流字节对齐。

现在通常,这将由byteAligned编解码器处理,但这种情况似乎需要整个解码操作的全局上下文。

这是问题的最小示例

items将被编码和解码为一个Vector项目Baz。请注意,qux成员 inBaz表示为 2 位无符号整数。我们希望abc成员是字节对齐的,这意味着在它的解码过程中,它将解码,如果字节流未对齐,则必须在解码位之后添加填充(案例 C)。

这意味着对于大小为 1 的向量(情况 A),输出 BitVector 将错位 6 位,这很好,因为没有更多项目(abc在向量解码循环中再也不会到达)。

没有字节对齐的大小为 2 的向量显示在案例 B 中。具有字节对齐的向量显示在案例 C 中。

每个案例下方是分解比特流的注释。0x0a十进制为十六进制,十进制0b01为二进制。当需要更多细节并且流不是字节对齐时,我将在两者之间切换。

案例A

案例B

案例C

查看案例 C 的另一种方法是展开编解码器

请注意,之后没有任何填充,abc(0)因为此时流是字节对齐的。abc(1)由于解码,它没有对齐qux(0)。对齐后,qux将在对齐的边界上解码。我们总是希望qux在字节对齐的位置上解码。

我需要一些方法来获取全局上下文以确定整个 BitVector 中的当前位指针是否对齐。如果不是,我需要一个编解码器来智能地知道它何时不在对齐的边界上解码,并在解码它的当前值后纠正流。

我知道编解码器可以获取当前比特流进行解码,但他们不知道它们在整个比特流中的位置。

任何方向或代码将不胜感激。

附言

如果你想在 Ammonite 中进行测试,你需要这个来开始

复制和粘贴时,您需要以 a 开头,{以确保同时定义案例类和案例对象。

0 投票
1 回答
93 浏览

scala - 找不到发布到 Maven 中心的 scodec-akka

我需要将 AKKA Streams 接收到的 ByteString 转换为 BitVector int 以便通过 scodec 对其进行解码。据说该库将在 org.scodec %% scodec-akka 下发布到 Maven 中心,如此处所述GitHub scodec-akka

所以我需要知道该库已被删除,否则我仍然可以通过某种方式获取它。如果没有,是否有任何工作可以进行这种转换?

0 投票
1 回答
146 浏览

scala - 在 Scodec 表示中有效地打包 Long 列表

我有一个带有 List[Long] 属性的案例类,我正在使用 Scodec 库将其转换为令牌。现在,它效率不高(空间方面),因为我正在使用这个编解码器:

listOfN(uint16, int64)

这是使用所有 64 位,即使我的 Long 永远不会超过几千(截至目前)。Scodec 库中是否有内置方法可以仅使用绝对需要的位数?

谢谢

0 投票
2 回答
144 浏览

scodec - 编码与向量不相邻的向量长度字段

我有以下我喜欢编码的结构。我知道如果大小字段直接位于矢量数据的前面,我可以使用 vector() 对矢量进行编码。但是这里编码向量大小的字段是不相邻的。

Outer 的解码没问题:

从位向量中读取 Header.numOfItems 并使用 vectorOfN(provide(hdr.numOfItems, Item.codec)) 创建项目

Outer 的编码是问题所在:

编码时,我希望从 items.length 中获取 numOfItem。我知道我可以在更新项目向量时使用附加代码设置 numOfItems 或使用“编码前回调”之类的东西。

问题是是否有更优雅的解决方案。对我来说Header.numOfItems是多余的Outer.items.length,所以理想情况下只有编码器应该知道 numOfItems。

0 投票
2 回答
289 浏览

scala - 记录按层次区分

我必须实现一些专有的二进制格式,并想用 scodec 来做到这一点。但是,我找不到简洁的解决方案。格式如下: 一个文件由多个 Records 组成,其中每个 Record 都以一个 little endian 16 位数字“t”(uint16L) 为前缀。根据 t 的第一个和第二个字节的值,记录可以分为 4 类:

  • 正常:t.first != 0 && t.second == 0
  • 条形图:t.first == 0x08 && t.second == 0xFF
  • Foo: t.first == 0x04 && t.second == 0x05
  • 无效:t 不是以上任何一项

如果 t 无效,则程序应退出,因为文件已损坏。如果 t 是 Normal 或 Bar,则 Record 的长度遵循 32 位 little endian int。如果 t 为 Foo,则必须先解析另一个 16 位大端int,然后才能将长度解析为 32 位 BE int。

此外,“Normal”中 t 的某些值未使用,应生成 UnknownRecord(类似于此处的 mpeg 实现:https ://github.com/scodec/scodec-protocols/blob/series/1.0.x/src/main /scala/scodec/protocols/mpeg/Descriptor.scala )

这是我目前的方法,但感觉不太清楚,我觉得我更多地围绕 scodec 工作,而不是使用它。有任何想法吗?随意在下面废弃我的代码..

PS:这是我在这里的第一个问题,我希望它足够清楚。=)

Edit1:我找到了一个至少可以完成这项工作的实现。如果记录未知,我会权衡以再次检查条件,以获得更清晰的层次结构。

Edit2:我在下面发布了一个替代解决方案作为答案

0 投票
1 回答
166 浏览

scala - 由于类具有非值字段,因此缺少 scodec.Codec[Command]

我正在尝试在现有项目中使用鉴别器,我猜我的课程有问题。

考虑这个编解码器示例。如果我将TurnLeft其编解码器更改为

我明白了

如果我制作degrees字段值字段,这一切都有效。我怀疑无形的东西很棘手。我应该怎么做才能让它工作?

演示该问题的示例项目在此处