如何将Java Long转换为Cassandra的byte ?
懒惰的程序员警报。 🙂
Cassandra将列值存储为字节( Java示例 )。 指定LongType比较器将这些字节比较为long。 我希望long的值成为一个Cassandra友好的byte []。 怎么样? 我捅了一会儿。 我想你们人们可以更快地帮助我。
编辑:
Alexander和Eli的回答都同意这种逆向转换 。 谢谢!
这里是从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; }
我会将long写入包含在DataOutputStream中的ByteArrayOutputStream ,然后检索原始字节,尽管这将始终以big endian字节顺序(最重要的字节优先)提供给你的数据:
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.wrap
包装一个8长字节数组并使用putLong
方法。 您必须首先使用ByteBuffer.order
方法设置ByteOrder。
你可以使用Cassandra的实用程序类: ByteBufferUtil.bytes(long n)
- Cassandra NoHostAvailableException Java-CQLDriver
- 在cassandra中将json存储为文本vs blob的优缺点是什么?
- Cassandra批处理查询具有不同分区键的表的性能
- 听听Cassandra数据存储区的变化?
- 使用IN子句过滤Spark Cassandra连接器
- 卡桑德拉:因为java.lang.UnsupportedClassVersionError
- 使用CQL jdbc驱动程序时应该是什么连接字符串
- 使用Hector在Cassandra中查询CompositeType列
- 主线程java.lang.NoClassDefFoundError中的exception