如何将Java Long转换为Cassandra的byte ?

懒惰的程序员警报。 🙂

Cassandra将列值存储为字节( Java示例 )。 指定LongType比较器将这些字节比较为long。 我希望long的值成为一个Cassandra友好的byte []。 怎么样? 我捅了一会儿。 我想你们人们可以更快地帮助我。

编辑:

Alexander和Eli的回答都同意这种逆向转换 。 谢谢!

这里是从java 6 DataOutputStream.writeLong剪切和粘贴的

 public final void writeLong(long v) throws IOException { writeBuffer[0] = (byte)(v >>> 56); writeBuffer[1] = (byte)(v >>> 48); writeBuffer[2] = (byte)(v >>> 40); writeBuffer[3] = (byte)(v >>> 32); writeBuffer[4] = (byte)(v >>> 24); writeBuffer[5] = (byte)(v >>> 16); writeBuffer[6] = (byte)(v >>> 8); writeBuffer[7] = (byte)(v >>> 0); out.write(writeBuffer, 0, 8); incCount(8); } 

以下是对您案例的修改

 public final byte[] longToBytes(long v) { byte[] writeBuffer = new byte[ 8 ]; writeBuffer[0] = (byte)(v >>> 56); writeBuffer[1] = (byte)(v >>> 48); writeBuffer[2] = (byte)(v >>> 40); writeBuffer[3] = (byte)(v >>> 32); writeBuffer[4] = (byte)(v >>> 24); writeBuffer[5] = (byte)(v >>> 16); writeBuffer[6] = (byte)(v >>> 8); writeBuffer[7] = (byte)(v >>> 0); return writeBuffer; } 

我会将long写入包含在DataOutputStream中的ByteArrayOutputStream ,然后检索原始字节,尽管这将始终以big endian字节顺序(最重要的字节优先)提供给你的数据:

 public static byte[] getBytes(Long val) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeLong(val); return baos.toByteArray(); } 

如果您希望能够指定字节顺序,可以使用ByteBuffer类:

 public static byte[] getBytes(Long val) { ByteBuffer buf = ByteBuffer.allocate(8); buf.order(ByteOrder.BIG_ENDIAN); buf.putLong(val); return buf.array(); } 

你可以通过使用移位和掩码来破坏字节,或者更容易的是ByteBuffer.wrap包装一个8长字节数组并使用putLong方法。 您必须首先使用ByteBuffer.order方法设置ByteOrder。

你可以使用Cassandra的实用程序类: ByteBufferUtil.bytes(long n)