Как конвертировать Java Long в байт [] для Cassandra? - PullRequest
4 голосов
/ 15 апреля 2010

Предупреждение ленивого программиста. :)

Cassandra хранит значения столбцов в байтах ( Пример Java ). При указании LongType Compara эти байты сравниваются как длинные. Я хочу, чтобы значение long в байт, дружественный Кассандре []. Как? Я выглянул на некоторое время. Я думаю, что вы, люди, можете помочь мне быстрее.

EDIT:

И Александр, и Илай согласились с этим обратным преобразованием . Спасибо!

Ответы [ 4 ]

5 голосов
/ 15 апреля 2010

Я бы записал long в 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();
}
3 голосов
/ 15 апреля 2010

Вот вырезать и вставить из 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;
}
2 голосов
/ 18 мая 2011

Вы можете использовать служебный класс Кассандры: ByteBufferUtil.bytes(long n)

2 голосов
/ 15 апреля 2010

Вы можете разбить байты на части, используя сдвиги и маску, или немного проще - ByteBuffer.wrap, чтобы обернуть 8-байтовый массив и использовать метод putLong. Сначала вы должны установить ByteOrder, используя метод ByteBuffer.order.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...