Java 在将数据存储到Cassandra时,是使用大端还是小端?
我需要使用Java代码将Java 在将数据存储到Cassandra时,是使用大端还是小端?,java,c++,cassandra,bytearray,endianness,Java,C++,Cassandra,Bytearray,Endianness,我需要使用Java代码将字节数组值写入Cassandra。然后我将用C++程序读取CasdRRA的相同的字节数组< /代码>数据。 该字节数组由三个字节数组组成,如下所述- short schemaId = 32767; long lastModifiedDate = "1379811105109L"; byte[] avroBinaryValue = os.toByteArray(); 现在,我将把schemaId、lastModifiedDate和avroBinaryValue一起写入一个
字节数组值写入Cassandra。然后我将用C++程序读取CasdRRA的相同的<代码>字节数组< /代码>数据。
该字节数组由三个字节数组组成,如下所述-
short schemaId = 32767;
long lastModifiedDate = "1379811105109L";
byte[] avroBinaryValue = os.toByteArray();
现在,我将把schemaId
、lastModifiedDate
和avroBinaryValue
一起写入一个字节数组
,并生成一个字节数组,我会写回卡桑德拉,然后我将有我的C++程序,它将从卡桑德拉检索字节数组数据,然后反序列化它,从代码中提取<代码> StasAudio/Cuff>,<代码> LSTMeXDIDENDATE < /COD>和<代码> avrBialValue</代码>。
所以现在我很困惑,在写Cassandra的时候是否应该在Java代码中使用Big-Endian?或者在将数据存储到Cassandra时,在这里使用小字节顺序
下面是代码,到目前为止我已经用Java实现了,它将所有内容序列化为一个单字节数组
public static void main(String[] args) throws Exception {
String os = "whatever os is";
byte[] avroBinaryValue = os.getBytes();
long lastModifiedDate = 1379811105109L;
short schemaId = 32767;
ByteArrayOutputStream byteOsTest = new ByteArrayOutputStream();
DataOutputStream outTest = new DataOutputStream(byteOsTest);
outTest.writeShort(schemaId); // first write schemaId
outTest.writeLong(lastModifiedDate); // second lastModifiedDate
outTest.writeInt(avroBinaryValue.length); // then attributeLength
outTest.write(avroBinaryValue); // then its value
byte[] allWrittenBytesTest = byteOsTest.toByteArray();
// write this allWrittenBytesTest into Cassandra
// now deserialize it and extract everything from it
DataInputStream inTest = new DataInputStream(new ByteArrayInputStream(allWrittenBytesTest));
short schemaIdTest = inTest.readShort();
long lastModifiedDateTest = inTest.readLong();
int sizeAvroTest = inTest.readInt();
byte[] avroBinaryValue1 = new byte[sizeAvroTest];
inTest.read(avroBinaryValue1, 0, sizeAvroTest);
System.out.println(schemaIdTest);
System.out.println(lastModifiedDateTest);
System.out.println(new String(avroBinaryValue1));
}
<>我也尝试着看看在java中是否有任何有效的或正确的方式来做这件事,因为我需要用C++程序从卡桑德拉中检索这些数据,所以我不希望C++上也有任何问题。所以我试图确保当我从Java端将这些数据写入Cassandra时,一切看起来都很好
<>现在,我正在测试我正在编写的字节数组,它是用java程序读取的,我用C++程序读取了那个文件,然后反序列化了那个字节数组…
我希望我的问题足够清楚。。有人能帮我吗?为什么不使用像google protobuf()通过这种方式,您无需担心底层细节,也无需从任何语言和工具进行读写操作出于某种原因,我无法使用它,因为我不想序列化两倍,因为我的实际值是Avro二进制编码值……而且我也不要求对不同的序列化框架进行评估。好的做法是就我所知,序列化框架。现在这里已经没有问题了,除非你在存储和读取同一个endianess,否则这无关紧要。如果你要从不同的endianess机器读取值,那么就使用最常用的机器,这样转换的次数就更少了。是的,我同意Pradheep。。但我的实际值是Avro二进制编码值,它本身就是一种数据序列化格式。。我不能用其他序列化格式对数据进行二进制编码。。因为我需要将三个字节数组合并成一个。。。如果我使用另一个序列化格式,那么我需要串行化/DeSerialTeal2,这不是我正在寻找的……你知道将允许你直接指定大或小字节,那么你需要的是确保你正确地解码它在C++侧?类似但不完全相同的例子。@WhozCraig:谢谢你的建议。。我一点也不知道o ByteBuffer。。我刚刚经历了。。看起来我可以通过在编写Cassandra时使用ByteBuffer使我的Java程序变得更好?对吗?然后我可以用C++程序来指定我需要在C++上执行哪一个字节序。您是否可以在我上面的Java解决方案的基础上给我一个示例,说明如何使用ByteBuffer做同样的事情?这将对我大有帮助。。谢谢..我评论中的链接问题提供了一组关于如何使用short
的非常好的示例。对于32位或64位的int
或long
,您应该也可以这样做。“知道”字节流中的值是大字节或小字节(我个人更喜欢前者)大大简化了C++代码侧,因此在代码中重新组装一个代码的例子很多,或者你可以使用<代码> NtoHLL()/Cyto> @ @ WoZoCurig:我更新了我用ByteBuffer的问题。你能看一下让我知道我买对了吗?而且,如果我选择ByteBuffer路线,我也不知道如何反序列化?