4

怠惰なプログラマの警告。:)

Cassandra は、列の値をバイトとして格納します ( Java の例)。LongType コンパレータを指定すると、それらのバイトが long として比較されます。long の値を Cassandra 対応の byte[] に入れたいです。どのように?しばらくぶらぶらしました。私はあなたが私をより速く助けることができると思います。

編集:

Alexander と Eli の両方の回答は、この逆変換に同意しました。ありがとう!

4

4 に答える 4

5

DataOutputStreamにラップされたByteArrayOutputStreamに long を書き込み、生のバイトを取得しますが、これにより常にビッグ エンディアンのバイト順 (最上位バイトが最初) でデータが得られます。

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

Cassandraのユーティリティクラスを使用できます。ByteBufferUtil.bytes(long n)

于 2011-05-18T12:40:01.470 に答える
2

シフトとマスクを使用してバイトを分割できます。または、ByteBuffer.wrap8 バイト配列をラップしてputLongメソッドを使用する方が少し簡単です。ByteBuffer.orderメソッドを使用して、最初に ByteOrder を設定する必要があります。

于 2010-04-14T21:33:46.700 に答える