【问题标题】:ZigZag decode/encode in JavaJava 中的 ZigZag 解码/编码
【发布时间】:2018-06-09 10:43:21
【问题描述】:

我正在寻找一些可以提供函数的库,这些函数可以帮助将 zig-zag 编码的字节数组解码为 2 的补码 long/int 并返回。

由于在protobuf 中使用了 ZigZag,我希望 guava 有它的用处,但谷歌搜索没有给出任何结果。通过 ZigZag 编码,我的意思是:

Signed Original Encoded As
0               0
-1              1
1               2
-2              3
2147483647      4294967294
-2147483648     4294967295

我必须“重新发明轮子”吗?

【问题讨论】:

  • 不是大轮子,2行代码。
  • @NiVeR 不完全是 2 行。查看它的实现,我发现它非常可怕。
  • gist.github.com/mfuerstenau/ba870a29e16536fdbaba 并向下滚动。好的,它是 python,但没有什么不是 1:1 Java 等价物。
  • 你链接的页面有你的答案:(n << 1) ^ (n >> 63) for 64-bit
  • @Arijoon 不适合 9 或 10 字节的长度。

标签: java long-integer zigzag-encoding


【解决方案1】:

给你:

    Long aD = 2147483647L;
    //encode
    Long aE = (aD >> 31) ^ (aD << 1);
    //decode
    Long bD = (aE >> 1) ^ -(aE & 1);

    System.out.println(aD + "," + aE + "," + bD);

【讨论】:

  • 问题是它不适用于编码为 9 或 10 字节的 long。
  • 如果你想处理任意长度的数字,你可以继续调整 BigInteger 类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 2019-02-08
相关资源
最近更新 更多