4

懒惰的程序员警报。:)

Cassandra 将列值存储为字节(Java 示例)。指定LongType 比较器会将这些字节作为 long 进行比较。我希望将 long 的值转换为 Cassandra 友好的字节 []。如何?我转了一圈。我认为你们可以更快地帮助我。

编辑:

亚历山大和伊莱的回答都同意这种反向转换。谢谢!

4

4 回答 4

5

我会将 long 写入包装在DataOutputStream中的ByteArrayOutputStream,然后检索原始字节,尽管这总是会以大端字节顺序(最重要的字节在前)为您提供数据:

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();
}
于 2010-04-14T21:45:26.477 回答
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;
}
于 2010-04-14T23:10:16.660 回答
2

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

于 2010-04-14T21:33:46.700 回答
2

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

于 2011-05-18T12:40:01.470 回答