我正在做一个项目,我应该将其写入ByteArray
文件。然后,使用 C++ 程序读取同一个文件。
我ByteArray
写入文件的内容是这三个的组合ByteArrays
-
- 前2 个字节是我的
schemaId
,我用短数据类型表示它。 - 然后下一个8 字节是我的
Last Modified Date
,我用长数据类型表示它。 - 剩余字节可以是可变大小,这是我的属性的实际值..
将结果ByteArray
写入文件后。现在我需要从该文件中读取C++ program
并读取将包含 ByteArray 的第一行,然后按照我上面提到的那样相应地拆分生成的 ByteArray 以便我能够从中提取我schemaId
的Last Modified Date
和我的实际attribute value
。
我一直用 Java 完成所有的编码,而且我是 C++ 的新手......我能够用 C++ 编写一个程序来读取文件,但不知道我应该如何以这样的方式读取 ByteArray,以便我能够像我上面提到的那样拆分它..
下面是我的 java 代码,它将生成的 ByteArray 写入一个文件,现在我需要从 c++ 中读回同一个文件。
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);
outTest.writeLong(lastModifiedDate);
outTest.writeInt(avroBinaryValue.length);
outTest.write(avroBinaryValue);
byte[] allWrittenBytesTest = byteOsTest.toByteArray();
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));
writeFile(allWrittenBytesTest);
}
/**
* Write the file in Java
* @param byteArray
*/
public static void writeFile(byte[] byteArray) {
try{
File file = new File("bytearrayfile");
FileOutputStream output = new FileOutputStream(file);
IOUtils.write(byteArray, output);
} catch (Exception ex) {
ex.printStackTrace();
}
}
下面是我的 C++ 程序,它正在读取上述文件(由 Java 编写),我不确定我应该怎么做才能以这种方式拆分 ByteArrays,以便我可以相应地读取单个 ByteArrays..
#include "ReadFile.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main () {
string line;
std::ifstream myfile("bytearrayfile", std::ios::binary);
//check to see if the file is opened:
if (myfile.is_open())
{
//while there are still lines in the
//file, keep reading:
while (! myfile.eof() )
{
// I am not sure what I am supposed to do here?
}
//close the stream:
myfile.close();
}
else cout << "Unable to open file";
return 0;
}
在反序列化单个 ByteArray 之后,我应该能够从上述 C++ 程序中提取 schemaId as 32767
、lastModifiedDate
as1379811105109
和我的 Attribute 值。whatever os is
我是 C++ 新手,因此面临很多问题。基于我的代码的任何示例都将帮助我更好地理解。
任何人都可以帮助我吗?谢谢。
更新:-
下面是我能够提取的最新代码schemaId
,lastModifiedDate
和attributeLength
。
但不确定如何提取实际的属性值-
int main() {
string line;
std::ifstream myfile("bytearrayfile", std::ios::binary);
if (myfile.is_open()) {
uint16_t schemaId;
uint64_t lastModifiedDate;
uint32_t attributeLength;
char buffer[8]; // sized for the biggest read we want to do
// read two bytes (will be in the wrong order)
myfile.read(buffer, 2);
// swap the bytes
std::swap(buffer[0], buffer[1]);
// only now convert bytes to an integer
schemaId = *reinterpret_cast<uint16_t*>(buffer);
cout<< schemaId <<endl;
// read eight bytes (will be in the wrong order)
myfile.read(buffer, 8);
// swap the bytes
std::swap(buffer[0], buffer[7]);
std::swap(buffer[1], buffer[6]);
std::swap(buffer[2], buffer[5]);
std::swap(buffer[3], buffer[4]);
// only now convert bytes to an integer
lastModifiedDate = *reinterpret_cast<uint64_t*>(buffer);
cout<< lastModifiedDate <<endl;
// read 4 bytes (will be in the wrong order)
myfile.read(buffer, 4);
// swap the bytes
std::swap(buffer[0], buffer[3]);
std::swap(buffer[1], buffer[2]);
// only now convert bytes to an integer
attributeLength = *reinterpret_cast<uint32_t*>(buffer);
cout<< attributeLength <<endl;
// not sure how to extract the actual attribute value?
//close the stream:
myfile.close();
}
else
cout << "Unable to open file";
return 0;
}