2010-04-14 39 views
4

懶惰程序員警報。 :)如何將Cassandra的Java Long轉換爲byte []?

Cassandra將列值存儲爲字節(Java example)。指定一個LongType comparator將這些字節比較爲長。我想要一個長期的價值卡桑德拉友好的字節[]。怎麼樣?我戳了一會兒。我認爲你們可以更快地幫助我。

編輯:

兩個亞歷山大和伊萊的答案同意this reverse transformation。謝謝!

+0

好吧,你只是挑剔。沒關係,甚至令人欽佩:) – 2010-04-14 21:35:30

回答

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; 
} 
+1

您是否展開循環,因爲它更高效? HotSpot編譯器會爲你做嗎? – dfrankow 2010-04-15 14:54:40

+0

呃,對不起,我想你沒有做出這個選擇,你只是用writeLong()做的事情去做。 – dfrankow 2010-04-15 15:01:28

2

你可以通過使用移位和掩碼來分開字節,或者更容易一點的是用ByteBuffer.wrap來包裝一個8長字節數組並使用putLong方法。您必須先使用ByteBuffer.order方法設置ByteOrder。

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

你知道如何分配一個ByteBuffer比較直接分配byte []嗎?我傾向於使用byte [] - 唯一的解決方案,因爲它似乎更便宜。 – dfrankow 2010-04-15 14:52:51

+0

我想我需要找到Cassandra的字節順序。 – dfrankow 2010-04-15 15:22:23

+0

@dfrankow:ByteBuffer是用C++編寫的,因此可能是爲提高效率而設計的。但是,我的建議是,在您對代碼進行簡要描述並確定其效率低下之前,不要擔心這些微觀優化。程序員在猜測他們代碼中的緩慢點在哪裏會出現令人吃驚的錯誤:) – 2010-04-15 17:36:25

2

可以使用Cassandra的實用工具類:ByteBufferUtil.bytes(long n)