懶惰程序員警報。 :)如何將Cassandra的Java Long轉換爲byte []?
Cassandra將列值存儲爲字節(Java example)。指定一個LongType comparator將這些字節比較爲長。我想要一個長期的價值卡桑德拉友好的字節[]。怎麼樣?我戳了一會兒。我認爲你們可以更快地幫助我。
編輯:
兩個亞歷山大和伊萊的答案同意this reverse transformation。謝謝!
懶惰程序員警報。 :)如何將Cassandra的Java Long轉換爲byte []?
Cassandra將列值存儲爲字節(Java example)。指定一個LongType comparator將這些字節比較爲長。我想要一個長期的價值卡桑德拉友好的字節[]。怎麼樣?我戳了一會兒。我認爲你們可以更快地幫助我。
編輯:
兩個亞歷山大和伊萊的答案同意this reverse transformation。謝謝!
這裏被切割並從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;
}
你可以通過使用移位和掩碼來分開字節,或者更容易一點的是用ByteBuffer.wrap
來包裝一個8長字節數組並使用putLong
方法。您必須先使用ByteBuffer.order
方法設置ByteOrder。
長我會寫一個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();
}
你知道如何分配一個ByteBuffer比較直接分配byte []嗎?我傾向於使用byte [] - 唯一的解決方案,因爲它似乎更便宜。 – dfrankow 2010-04-15 14:52:51
我想我需要找到Cassandra的字節順序。 – dfrankow 2010-04-15 15:22:23
@dfrankow:ByteBuffer是用C++編寫的,因此可能是爲提高效率而設計的。但是,我的建議是,在您對代碼進行簡要描述並確定其效率低下之前,不要擔心這些微觀優化。程序員在猜測他們代碼中的緩慢點在哪裏會出現令人吃驚的錯誤:) – 2010-04-15 17:36:25
可以使用Cassandra的實用工具類:ByteBufferUtil.bytes(long n)
好吧,你只是挑剔。沒關係,甚至令人欽佩:) – 2010-04-14 21:35:30