【问题标题】:Storing java byte array readable in Cpp在Cpp中存储可读的java字节数组
【发布时间】:2014-05-21 18:11:07
【问题描述】:

我在将结构 {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 代码是开放的。

【问题讨论】:

  • Endianess 只是众多负担之一。结构打包/填充、成员顺序、整数大小...您应该展示您的代码、如何在 java 中填充字节数组以及如何在 C++ 中读取它
  • 好的,我已经添加了我的“代码”...不确定,我真的很绝望,所以我降低了对干净代码的要求
  • 我建议你用十六进制编辑器打开这个文件,至少在开始的时候尝试识别你的值,然后你可以看到它们是如何与你使用的每种方法一起存储的。当你知道这一点后,你就可以设计一个合适的 C/C++ 结构来包含文件中的每个元组

标签: java c++ arrays binary byte


【解决方案1】:

你只写了第一个整数..你从来没有写过第二个整数.. 因此,您读取的任何值当然都是随机的。请记住,C++ 中的 sizeof(long) 实际上可能不像 Java 中那样是 8!另外不要忘记 C++ 中的结构可能会被填充,最好将每个值一次读入结构的字段中。

这行得通..

在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));

【讨论】:

  • 啊,对不起,我只复制了一个整数。谢谢你的回复,我马上试试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多