Ruby - Возвращает байтовый массив, содержащий два дополнения представления Bignum / Fixnum - PullRequest
3 голосов
/ 12 марта 2011

Я пытаюсь вернуть байтовый массив, содержащий два дополнения представления Bignum или Fixnum (в Ruby).В Java есть метод, который делает именно это - Документы: Java toByteArray () метод , код для него: https://gist.github.com/867409

Мои требования такие же, как и для метода Java (взяты изСтраница Java): Массив байтов будет иметь порядок байтов в старшем порядке: самый старший байт находится в нулевом элементе.Массив будет содержать минимальное количество байтов, необходимое для представления этого 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

1 Ответ

5 голосов
/ 12 марта 2011

Конечное условие немного сложнее.Вот так:

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