2011-03-12 13 views
3

我試圖返回包含Bignum或Fixnum(Ruby)的二進制補碼錶示的字節數組。 Java中有一種方法可以完全實現 - 文檔:Java toByteArray() method,代碼爲:https://gist.github.com/867409Ruby - 包含Bignum/Fixnum的二進制補碼錶示的返回字節數組

我的需求與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 
+0

我_think_你應該能夠通過在Ruby中使用'>>'得到相同的結果。你嘗試過嗎? – Dogbert 2011-03-12 18:11:41

+0

這是不同的。 >>>是一個無符號的右移運算符,>>是有符號的。 – bensie 2011-03-12 18:14:13

+0

啊,你說得對。這是Java中的一個合理的右移。 – Dogbert 2011-03-12 18:20:02

回答

5

的結束條件是有點棘手。這裏是:

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

當做to_byte_array(35)我得到「不能將Fixnum轉換成數組」 – bensie 2011-03-12 18:46:12

+0

@bensie:對不起,2編輯後面的東西應該工作... – 2011-03-12 18:47:58

+0

你搖滾,完美的作品。 – bensie 2011-03-12 19:06:02