Ruby - 返回包含 Bignum/Fixnum 的二进制补码表示的字节数组

2023-12-03

我试图返回一个字节数组,其中包含 Bignum 或 Fixnum(在 Ruby 中)的补码表示形式。 Java 中有一个方法可以做到这一点 - 文档:Java toByteArray() 方法,其代码:https://gist.github.com/867409

我的要求与 Java 方法相同(取自 Java 页面):字节数组将采用大端字节顺序:最高有效字节位于第零个元素中。该数组将包含表示此 BigInteger 所需的最小字节数,包括至少一个符号位,即(ceil((this.bitLength() + 1)/8)).

红宝石没有>>>运算符(我认为)这就是为什么我在将这个概念转换为 Ruby 时遇到很多问题。

添加一些不起作用的代码:

def to_byte_array(num)
  result = []
  until num == 0
    result = [num & 0xff] + result
    num = num >> 8
  end
  result
end

最终条件有点棘手。事情是这样的:

def to_byte_array(num)
  result = []
  begin
    result << (num & 0xff)
    num >>= 8
  end until (num == 0 || num == -1) && (result.last[7] == num[7])
  result.reverse
end

p [0, 1, 255, 256, -1, -128, -256].map{|i| to_byte_array(i)}
# => [[0], [1], [0, 255], [1, 0], [255], [128], [255, 0]]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby - 返回包含 Bignum/Fixnum 的二进制补码表示的字节数组 的相关文章

随机推荐