[英]Java, JNI and C++: How do I generate a header file from native method declarations?
[英]How do I read a binary file in C++ if I generate it in Java?
我正在研究一种加密算法,我需要用Java(二进制文件)生成一些信息才能用C ++读取。
我不确定问题是如何创建二进制文件或如何读取二进制文件,尽管我可以完美地读取Java中的信息。
所以我做了一个简单的测试。 在Java中,我将数字9保存到二进制文件中,然后尝试用C ++读取它,但是它不读取数字。
有人可以告诉我我该怎么做吗?
Java代码:
int x = 9;
try{
ObjectOutputStream salida=new ObjectOutputStream(new
FileOutputStream("test.bin"));
salida.writeInt(x);
salida.close();
System.out.println("saved");
} catch(Exception e){
System.out.println(e);
}
C ++代码:
streampos size;
char * memblock;
ifstream file ("test.bin", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
cout<< size << endl;
memblock = new char [size];
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();
int i;
for (i = 0; i < sizeof(memblock); i++)
{
cout << memblock[i] <<endl;
}
delete[] memblock;
}
else cout << "Unable to open file";
这是输出:
�
�
w
您的问题是您正在使用ObjectOutputStream
写入数据。 这将以专用于Java的形式对对象图进行编码,以供ObjectInputStream
读取。 为了使数据流与C ++兼容,您需要执行以下两项操作之一:
ObjectOutputStream
产生的输出格式-即在C ++中重新实现Java在ObjectInputStream
。 不建议这样做。 FileOutputStream
从Java写入数据,然后可以由C ++代码读取。 如何指定和实现此功能取决于您,但是可以非常简单,具体取决于数据的复杂性。 您必须以16进制写入文件int
(4个字节?),在文件中必须包含09 00 00 00
这样的数据。 在您的cpp代码中,将其读取到char数组(读取字节!), file.tellg();
返回4,您将读取到char * memblock
数组{ char * memblock
}。 然后将其打印为chars cout << memblock[i] <<endl;
。 因此,您可以将输出数组打印为
for (i = 0; i < size / sizeof(int) / ; i++) {
cout << ((int*)memblock)[i] <<endl;
}
或以int数组读取
int* memblock;
...
memblock = new int[size / sizeof(int)];
...
file.read (memblock, (size / sizeof(int)) * sizeof(int));
Java代码:
import java.io.DataOutputStream;
import java.io.FileOutputStream;
public class Main
{
public static void main( String[] args )
{
int x = 9;
try
{
FileOutputStream fout = new FileOutputStream( "prueba.bin" );
DataOutputStream salida = new DataOutputStream( fout );
salida.writeInt( x );
salida.close();
System.out.println( "guardado" );
}
catch( Exception e )
{
System.out.println( e );
}
}
}
C ++ Builder代码:
unsigned char buffer[4];
ifstream file( "prueba.bin", ios::in | ios::binary );
if( file.is_open() )
{
file.read( (char*)&buffer, sizeof( buffer ) );
int num = buffer[ 0 ] | buffer[1] | buffer[ 2 ] | buffer[ 3 ];
// another way to convert endianness:
// int num = buffer[ 0 ] | ( buffer[1] << 8 ) | ( buffer[ 2 ] << 16 ) | ( buffer[ 3 ] << 24 );
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.