【问题标题】:Rationale for CBOR negative integersCBOR 负整数的基本原理
【发布时间】:2018-05-29 12:12:51
【问题描述】:

我很困惑为什么 CBOR 选择将负整数编码为无符号二进制数,其值定义为 -1 减去无符号值,而不是例如常规二进制补码表示。除了增加的负范围(IMO 与增加的复杂性相比,它的价值值得怀疑)之外,我是否还缺少一个明显的优势?

【问题讨论】:

    标签: encoding signed cbor


    【解决方案1】:

    优点:

    1. 每个整数值只有一种允许的编码类型,因此所有编码器都会发出一致的输出。如果编码器按照规范建议对每个值使用最短编码,它们将发出相同的输出。
    2. 非负数比有符号负数更容易选择最短的数字字段,CBOR 旨在让微型 IOT 设备轻松传输数据。
    3. 它将两倍的值放入每个整数编码字段宽度,从而使数据更加紧凑。 (如果整数编码不重叠,它会更紧凑,但这会明显更复杂。)
    4. 在需要 bignum 扩展之前,它可以处理两倍大的负值。

    【讨论】:

    • 这些都是真的,尽管我认为 3 和 4 是主要驱动力。对于一个聪明的实现,它可以减小解码器的大小,尽管乍一看可能并不清楚。在解码器根据主要类型代码调度之前,“附加信息”数据总是在公共代码中解码为无符号。
    • CBOR 负整数格式的缺点是解码后的字节不能直接被memcpy'ed(和字节序翻转)成二进制补码有符号整数。不过,我没有任何性能测试来确定性能损失是否显着。
    • 如果有符号整数有两种可能的编码类型(如在 MessagePack 中),为什么会出现问题?你能举个例子说明这是个问题吗?
    • @emilecormier 允许对同一个值进行多种编码具有较小的成本:不太紧凑的编码,更复杂的测试,无法进行通用的cmp 比较,代码之间更改或合并期间的错误风险更大叉子,...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    相关资源
    最近更新 更多