【问题标题】:Ruby - Return byte array containing two's complement representation of Bignum/FixnumRuby - 返回包含 Bignum/Fixnum 的补码表示的字节数组
【发布时间】:2011-03-12 18:03:30
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 认为您应该能够通过在 Ruby 中使用 >> 获得相同的结果。你试过吗?
  • 不一样。 >>> 是无符号右移运算符,>> 是有符号的。
  • 啊,你是对的。这是 Java 的逻辑右移。
  • 附带说明,如果您确实尝试实现此功能,那么如果您发布具有预期输出的非工作代码将会很有帮助。
  • 你也需要这个来处理负数吗?这是您正在寻找的输出之王吗? ideone.com/nvFKC

标签: ruby bytearray


【解决方案1】:

结束条件有点棘手。就是这样:

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]]

【讨论】:

  • 执行 to_byte_array(35) 时出现“无法将 Fixnum 转换为数组”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
相关资源
最近更新 更多