要将 int 转换为字节数组,我使用以下代码:
int a = 128;
byte[] b = convertIntValueToByteArray(a);
private static byte[] convertIntValueToByteArray(int intValue){
BigInteger bigInteger = BigInteger.valueOf(intValue);
byte[] origByteArray = bigInteger.toByteArray();
byte[] noSignByteArray = new byte[bigInteger.bitLength()/8];
if(bigInteger.bitLength()%8!=0){
noSignByteArray = origByteArray;
}else{
System.arraycopy(origByteArray,1,noSignByteArray,0,noSignByteArray.length);
}
return noSignByteArray;
}
我正在尝试做两件事。
1)我需要知道原始整数的字节数(四舍五入到结束字节)。但是,当我调用 toByteArray() 方法时,我不需要为符号位添加的额外位。这就是我有辅助方法的原因。所以在这个例子中,如果我没有辅助方法,当我将 128 转换为字节数组时,由于符号位,我得到的长度为 2 个八位字节,但我只希望它是一个八位字节。
2)我需要数字的积极表示。在这个例子中,如果我尝试打印数组 b 中的第一个元素,我得到 -128。但是,我将使用的数字只是正数,所以我真正想要的是 128。我仅限于使用字节数组。有没有办法做到这一点?
更新帖子
感谢您的回复。我还没有找到我正在寻找的确切答案,所以我会尝试提供更多细节。最终,我想在数据输出流上写入不同类型的值。在这篇文章中,我想澄清将整数写入数据输出流时会发生什么。我遇到过两种情况。
1)
DataOutputStream os = new DataOutputStream(this.socket.getOutputStream());
byte[] b = BigInteger.valueOf(128).toByteArray();
os.write(b);
2)
DataOutputStream os = new DataOutputStream(this.socket.getOutputStream());
os.write(128);
在第一种情况下,当从数据输入流中读取字节时,字节数组中的第一个元素似乎是表示 msb 的 0,而数组中的第二个元素包含数字 -128。但是,由于 msb 为 0,我们可以确定它是正数。在第二种情况下,没有 msb 并且从输入流读取的字节数组中存在的唯一元素是 -128。我期待数据输出流的 write() 方法以与 BigInteger 对象上的 toByteArray() 方法相同的方式将 int 转换为字节数组。但是,情况似乎并非如此,因为 msb 不存在。所以我的问题是,在第二种情况下,如果没有 msb,我们应该如何知道 128 应该是一个正数而不是负数。