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

时间:2010-04-14 21:23:25

标签: java cassandra

懒惰的程序员警报。 :)

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

修改

亚历山大和以利的回答都同意this reverse transformation。谢谢!

4 个答案:

答案 0 :(得分:5)

我会将长整数写入包含在ByteArrayOutputStream中的DataOutputStream,然后检索原始字节,尽管这将始终以大端字节顺序(最重要的字节优先)给出数据:

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();
}

答案 1 :(得分:3)

这是来自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;
}

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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