将长整型转换为字节数组并将其添加到另一个数组

我想更改字节数组中的值,以将长时间戳值放入MSB中。 有人能告诉我什么是最好的办法。 我不想插入一些我认为效率很低的值。

long time = System.currentTimeMillis(); Long timeStamp = new Long(time); byte[] bArray = new byte[128]; 

我想要的是这样的:

 byte[0-63] = timeStamp.byteValue(); 

是这样的可能。 编辑/插入此字节数组中的值的最佳方法是什么? 因为字节是一个原始的我不认为有一些直接的实现,我可以使用?

编辑:
看来, System.currentTimeMillis()Calendar.getTimeInMillis()更快,所以用上面的代码replace它。请纠正我,如果错误。

有多种方法可以做到这一点:

  • 使用ByteBuffer (最好的选项 – 简洁易读):

     byte[] bytes = ByteBuffer.allocate(Long.SIZE / Byte.SIZE).putLong(someLong).array(); 
  • 您也可以使用DataOutputStream (更详细):

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeLong(someLong); dos.close(); byte[] longBytes = baos.toByteArray(); 
  • 最后,您可以手动执行此操作(取自Hector代码中的LongSerializer )(难以阅读):

     byte[] b = new byte[8]; for (int i = 0; i < size; ++i) { b[i] = (byte) (l >> (size - i - 1 << 3)); } 

然后你可以通过一个简单的循环将这些字节附加到你现有的数组中:

 // change this, if you want your long to start from // a different position in the array int start = 0; for (int i = 0; i < longBytes.length; i ++) { bytes[start + i] = longBytes[i]; } 

如果你想真正得到隐藏…

 public byte[] longToByteArray(long value) { return new byte[] { (byte) (value >> 56), (byte) (value >> 48), (byte) (value >> 40), (byte) (value >> 32), (byte) (value >> 24), (byte) (value >> 16), (byte) (value >> 8), (byte) value }; } 

对我而言,从时间的angular度来看,ByteBuffer和其他的utils是很昂贵的。 以下是可以使用的两种方法:

//第一个方法(即使用第二个方法),它返回分配和实现的数组

 public byte[] longToByteArray(long value) { byte[] array = new byte[8]; longToByteArray(value,array,0); return array; } 

//如果你已经分配了缓冲区,并且你想在数组中写一个特定的位置,这个方法是很有用的。

 public void longToByteArray(long value, byte[] array, int startFrom) { for (int i=7; i>=0; i--) { array[startFrom+7-i] = (byte) (value >> i*8); } } 

它看起来不像你可以切片的字节数组插入到一个子集,而不是逐字节地做。 看一下在Java中抓取一个数组的一段,而不用在堆上创build一个新的数组 。 基本上我会做的是创build一个64字节的数组,并设置时间,然后追加一个空白的64字节数组。 或者只是逐字节地做。

我正在更新这篇文章,因为我刚刚宣布了一个库的预发布版本,将长转换为字节数组(并再次)。 该库是非常小的,将任何Java原始转换为字节数组。

http://rschilling.wordpress.com/2013/09/26/pre-release-announcement-pend-oreille/ http://code.google.com/p/pend-oreille/

如果你使用它,你可以做一些事情,比如将长数组转换成字节数组:

 Double[] doubles = new Double[1000]; for (int i = 2; i < 1002; i++) { doubles[i - 2] = (double) i; } byte[] resultBytes1 = (byte[]) new PrimitiveHelper(PrimitiveUtil.unbox(doubles)) .asType(byte[].class); 

您也可以转换单个长整型值。

 byte[] resultBytes1 = (byte[]) new PrimitiveHelper(1000l) .asType(byte[].class); 

随意提供一些反馈。

2013年10月4日更新:我现在发布了图书馆的制作http://rschilling.wordpress.com/2013/10/04/pend-oreille-official-1-0-release/