2017-01-25 59 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" 

这将从根本上抵消符号位,使得数字签名。