我在将结构{int,int,long}存储为java中的字节数组并将其作为Cpp中的二进制结构读取时遇到了一些困难。
我几乎尝试了一切。我最大的成功是当我能正确读取Long值,但整数是一些随机数。
我害怕字节序,我不知道如何判断哪种语言使用的是小字节或大字节序。请问任何人,请告诉我,如何在java中存储原始类型(如int,long,double)并在Cpp中读取它?
谢谢,这真的很有帮助。
编辑: 我知道如何在C ++中阅读它:
struct tick {
int x;
int y;
long time;
};
...
tick helpStruct;
input.open("test_file", ios_base::in | ios_base::binary);
input.read((char*) &helpStruct, sizeof(tick));
在Java中,我尝试了很多方法,我的最后一次尝试是:
DataOutput stream = new DataOutputStream(new FileOutputStream(new File("test_file")));
byte[] bytes = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(1).array();
for (byte b : bytes) {
stream.write(b);
}
但Java代码是开放的。
答案 0 :(得分:1)
你只写了第一个整数..你从来没有写过第二个整数然后是长整数..
因此,您阅读的任何值当然都是随机的。请记住,C ++中的sizeof(long)
实际上可能不是8,因为它在java中!另外,不要忘记C ++中的结构可能是填充的,最好一次一个地读取每个值到struct的字段中。
这有效..
在java方面:
package test;
import java.io.*;
import java.nio.*;
public class Test {
public static void main(String[] args) throws FileNotFoundException, IOException {
DataOutput stream = new DataOutputStream(new FileOutputStream(new File("C:/Users/Brandon/Desktop/test_file.dat")));
int sizeofint = 4;
int sizeoflong = 4;
ByteBuffer buffer = ByteBuffer.allocate(sizeofint + sizeofint + sizeoflong).order(ByteOrder.LITTLE_ENDIAN);
buffer.putInt(5).putInt(6).putInt(7);
byte[] bytes = buffer.array();
for (byte b : bytes) {
stream.write(b);
}
}
}
并且在C ++方面:
#include <fstream>
#include <iostream>
struct tick
{
int x;
int y;
long time;
};
int main()
{
std::fstream file("C:/Users/Brandon/Desktop/test_file.dat", std::ios::in | std::ios::binary);
if (file.is_open())
{
tick t = {0};
file.read(reinterpret_cast<char*>(&t), sizeof(t));
file.close();
std::cout<<t.x<<" "<<t.y<<" "<<t.time<<"\n";
}
}
结果是:5 6 7
。
甚至可能更好:
file.read(reinterpret_cast<char*>(&t.x), sizeof(t.x));
file.read(reinterpret_cast<char*>(&t.y), sizeof(t.y));
file.read(reinterpret_cast<char*>(&t.time), sizeof(t.time));