将long转换为byte数组并将其添加到另一个数组

cod*_*ver 50 java bytearray type-conversion long-integer

我想更改字节数组中的值以将长时间戳值放入MSB中.谁能告诉我最好的方法呢?我不想逐位插入值,我认为这是非常低效的.

long time = System.currentTimeMillis();
Long timeStamp = new Long(time);
byte[] bArray = new byte[128];
Run Code Online (Sandbox Code Playgroud)

我想要的是:

byte[0-63] = timeStamp.byteValue(); 
Run Code Online (Sandbox Code Playgroud)

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

编辑:
似乎System.currentTimeMillis()比它更快Calendar.getTimeInMillis(),所以用它替换上面的代码.如果错误,请纠正我.

Boz*_*zho 131

有多种方法可以做到:

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

// 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];
}
Run Code Online (Sandbox Code Playgroud)

  • @mikejones请注意,Long.SIZE将为您提供用于表示Long的位数(http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html#SIZE).你需要(Long.SIZE/Byte.SIZE)来匹配上面的例子. (7认同)
  • 我发现我必须像这样在ByteByffer上设置顺序,否则字节的顺序与我期望的字节顺序相反[] bytes = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN).putLong(比特).array(); (5认同)
  • 为了避免硬编码长的大小,我会使用`allocate(Long.SIZE)` (5认同)
  • @overthink Java 8为此引入了一个BYTES常量(http://docs.oracle.com/javase/8/docs/api/java/lang/Long.html#BYTES). (3认同)
  • 我假设Java [通常是大端](http://stackoverflow.com/questions/981549/javas-virtual-machines-endianness),而x86是小端. (2认同)

小智 20

如果你想真正深入了解......

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
    };
}
Run Code Online (Sandbox Code Playgroud)