Java 在将数据存储到Cassandra时,是使用大端还是小端?

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一起写入一个

我需要使用Java代码将
字节数组
值写入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路线,我也不知道如何反序列化?