怠惰なプログラマの警告。:)
Cassandra は、列の値をバイトとして格納します ( Java の例)。LongType コンパレータを指定すると、それらのバイトが long として比較されます。long の値を Cassandra 対応の byte[] に入れたいです。どのように?しばらくぶらぶらしました。私はあなたが私をより速く助けることができると思います。
編集:
Alexander と Eli の両方の回答は、この逆変換に同意しました。ありがとう!
怠惰なプログラマの警告。:)
Cassandra は、列の値をバイトとして格納します ( Java の例)。LongType コンパレータを指定すると、それらのバイトが long として比較されます。long の値を Cassandra 対応の byte[] に入れたいです。どのように?しばらくぶらぶらしました。私はあなたが私をより速く助けることができると思います。
編集:
Alexander と Eli の両方の回答は、この逆変換に同意しました。ありがとう!
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();
}
これは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;
}
Cassandraのユーティリティクラスを使用できます。ByteBufferUtil.bytes(long n)
シフトとマスクを使用してバイトを分割できます。または、ByteBuffer.wrap
8 バイト配列をラップしてputLong
メソッドを使用する方が少し簡単です。ByteBuffer.order
メソッドを使用して、最初に ByteOrder を設定する必要があります。