Я написал программу Java для записи ByteArray
в файл. И что в результате ByteArray
является в результате этих трех ByteArrays-Как разбить ByteArray, прочитав из файла на C++?
- Первый 2 байта это мой
schemaId
, который я представлял его, используя короткий тип данных. - Затем следующий 8 байтов - это мой
Last Modified Date
, который я представил с использованием длинного типа данных. - И остальные байты могут быть различного размера, который мое фактическое значение для моих атрибутов ..
Так у меня есть файл сейчас, в котором первая строка содержит в результате ByteArray, который будет иметь все вышеуказанные байты, как я уже говорил выше. Теперь мне нужно прочитать этот файл из программы на C++ и прочитать первую строчку, которая будет содержать ByteArray, а затем разделить полученный результат ByteArray соответственно, как я упоминал выше, так что я могу извлечь мои schemaId
, Last Modified Date
и мое фактическое значение атрибута от него.
Я все свое кодирование выполнял всегда на Java, и я новичок в C++ ... Я могу написать программу на C++ для чтения файла, но не уверен, как читать этот ByteArray таким образом, чтобы Я могу разбить его, как я уже говорил выше ..
Ниже мой C++ программа, которая читает файл и печать на консоли ..
int main() {
string line;
//the variable of type ifstream:
ifstream myfile ("bytearrayfile");
//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())
{
//place the line from myfile into the
//line variable:
getline (myfile,line);
//display the line we gathered:
// and here split the byte array accordingly..
cout << line << endl;
}
//close the stream:
myfile.close();
}
else cout << "Unable to open file";
return 0;
}
Может кто-нибудь помочь мне с этим? Благодарю.
Update
Ниже мой 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++ ничего не напечатает (из-за ранних 0 байтов) или не будет печатать ничего полезного. Что вы видите и что вы ожидаете увидеть? – yzt
Как подсказка, вам нужно знать разницу между ** бинарными ** и ** текстовыми ** данными и как читать/разбирать их. – yzt
@yzt: Да .. Эта программа на C++ не является полной, поскольку я не добавил никакой логики для разделения ByteArray. Или это может быть другой способ прочитать файл, который содержит ByteArray в строке. Я разработчик Java, в основном, так мало знакомы с C++ ... Прямо сейчас вышеуказанная программа на C++ просто распечатает каждую строку ... – AKIWEB