BigEndian バイト オーダー形式で ByteBuffer を適切に使用しようとしています。
Cassandraデータベースに保存する前に、単一のByteBufferにまとめようとしているフィールドがいくつかあります。
Cassandra に書き込むバイト配列は、以下で説明する 3 つのバイト配列で構成されています。
short employeeId = 32767;
long lastModifiedDate = "1379811105109L";
byte[] attributeValue = os.toByteArray();
ここで、と を一緒に 1 つのバイト配列に書き込みemployeeId
、その結果のバイト配列を Cassandra に書き込みます。次に、そのバイト配列データを Cassandra から取得し、デシリアライズして を抽出する C++ プログラムを作成します。それ。lastModifiedDate
attributeValue
employeeId
lastModifiedDate
attributeValue
これを行うために、BigEndian バイト オーダー形式の ByteBuffer を使用しています。
私はこのコードをまとめました -
public static void main(String[] args) throws Exception {
String text = "Byte Buffer Test";
byte[] attributeValue = text.getBytes();
long lastModifiedDate = 1289811105109L;
short employeeId = 32767;
int size = 2 + 8 + 4 + attributeValue.length; // short is 2 bytes, long 8 and int 4
ByteBuffer bbuf = ByteBuffer.allocate(size);
bbuf.order(ByteOrder.BIG_ENDIAN);
bbuf.putShort(employeeId);
bbuf.putLong(lastModifiedDate);
bbuf.putInt(attributeValue.length);
bbuf.put(attributeValue);
bbuf.rewind();
// best approach is copy the internal buffer
byte[] bytesToStore = new byte[size];
bbuf.get(bytesToStore);
// write bytesToStore in Cassandra...
// Now retrieve the Byte Array data from Cassandra and deserialize it...
byte[] allWrittenBytesTest = bytesToStore;//magicFunctionToRetrieveDataFromCassandra();
ByteBuffer bb = ByteBuffer.wrap(allWrittenBytesTest);
bb.order(ByteOrder.BIG_ENDIAN);
bb.rewind();
short extractEmployeeId = bb.getShort();
long extractLastModifiedDate = bb.getLong();
int extractAttributeValueLength = bb.getInt();
byte[] extractAttributeValue = new byte[extractAttributeValueLength];
bb.get(extractAttributeValue); // read attributeValue from the remaining buffer
System.out.println(extractEmployeeId);
System.out.println(extractLastModifiedDate);
System.out.println(new String(extractAttributeValue));
}
私が現在行っている方法で、これを行うより良い方法はありますか?または、ここでできるいくつかの小さな改善??
ByteBuffer を使用するのはこれが初めてなので、少し問題があります...
誰でも見て、これが ByteBuffer を使用する正しい方法であるかどうかを教えてもらえますか?