如何在Java中初始化和增加字节数组?

时间:2013-10-26 04:14:54

标签: java arrays int bytearray

每次进入某个循环时,我需要增加一个32位的值。但是,最终它必须采用字节数组(byte [])形式。最好的方法是什么?

选项1:

byte[] count = new byte[4];
//some way to initialize and increment byte[]

选项2:

int count=0;
count++;
//some way to convert int to byte

选项3:??

2 个答案:

答案 0 :(得分:0)

您可以将int转换为byte[],如下所示:

ByteBuffer b = ByteBuffer.allocate(4);
//b.order(ByteOrder.BIG_ENDIAN); // optional, the initial order of a byte buffer is always BIG_ENDIAN.
b.putInt(0xAABBCCDD);

byte[] result = b.array();  

来源:Convert integer into byte array (Java)

现在是增量部分。您可以按照相同的方式递增整数。使用++或任何需要。然后,清除ByteBuffer,再次输入数字,flip()缓冲区并获取数组

答案 1 :(得分:-1)

另一种便捷的方法是以下方法,该方法也可用于任意长度的字节数组:

byte[] counter = new byte[4]; // all zeroes
byte[] incrementedCounter = new BigInteger(1, counter).add(BigInteger.ONE).toByteArray();
if (incrementedCounter.length > 4) {
    incrementedCounter = ArrayUtils.subarray(incrementedCounter, 1, incrementedCounter.length);
}
else if (incrementedCounter.length < 5) {
   incrementedCounter = ArrayUtils.addAll(new byte[5-incrementedCounter.length], incrementedCounter);
}
// do something with the counter
...
counter = incrementedCounter ;

计数器将在2 ^ 32位后溢出。由于BigInteger也使用了符号位,因此可能有必要切断一个额外的前导字节(在代码中完成)。通过这种切割在这里处理溢出,并再次从0开始。

ArrayUtils来自org.apache.commons库。