2017-01-25 84 views
1

我正在尋找一種方法,如何可逆地將任意長度的字節[]轉換爲正數數字(字符串在數字中的表示形式)。Java:ByteArray爲正數,反之亦然

的BigInteger提供了一個解決方案:

byte[] originalBytes = ... 
String string = new BigInteger(originalBytes).toString(); 
... 
byte[] decodedBytes = new BigInteger(string).toByteArray(); 

但是,我不知道如何讓擺脫優雅負值(或其中存儲的標誌),並保持過程可逆的。

+0

我不知道如何保持相同的數字,但刪除負值。你可以在所有的數字上加127,但顯然所有的數字都是不同的。這個過程將是可逆的。 –

+0

澄清「優雅地擺脫負值」 –

+0

@Tron你是說你收到的字節沒有二進制補碼形式,換句話說你正在使用無符號字節?你能用一個簡單的例子來展開你的問題嗎? –

回答

3

編輯:只需更換

String string = new BigInteger(originalBytes).toString(); 

String string = new BigInteger(1, originalBytes).toString(); 

1,信號,傳遞的陣列表示正數(signum = 1)

原件:

你可以只前綴陣列零字節:

byte[] original = new byte[] { (byte) 255 }; 

System.out.println(new BigInteger(original).toString()); // prints "-1" 

byte[] paddedCopy = new byte[original.length + 1]; 
for (int i = 0; i < original.length; i++) { 
    paddedCopy[i + 1] = original[i]; 
} 
System.out.println(new BigInteger(paddedCopy).toString()); // prints "255" 

這將從根本上抵消符號位,使得數字簽名。