2013-09-29 2 views
0

Я написал программу 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(); 
    } 
} 
+0

Ваши описания, кажется, предполагают, что вы пишете двоичные данные, и поэтому очень вероятно, что эта программа на C++ ничего не напечатает (из-за ранних 0 байтов) или не будет печатать ничего полезного. Что вы видите и что вы ожидаете увидеть? – yzt

+0

Как подсказка, вам нужно знать разницу между ** бинарными ** и ** текстовыми ** данными и как читать/разбирать их. – yzt

+0

@yzt: Да .. Эта программа на C++ не является полной, поскольку я не добавил никакой логики для разделения ByteArray. Или это может быть другой способ прочитать файл, который содержит ByteArray в строке. Я разработчик Java, в основном, так мало знакомы с C++ ... Прямо сейчас вышеуказанная программа на C++ просто распечатает каждую строку ... – AKIWEB

ответ

1

Это не посмотрите, как вы хотите использовать std::getline, чтобы прочитать эти данные. Ваш файл не записывается в виде текстовых данных в строке за строкой - он в основном имеет двоичный формат.

Вы можете использовать метод readstd::ifstream для считывания произвольных фрагментов данных из входного потока. Вы, вероятно, хотите, чтобы открыть файл в двоичном режиме:

std::ifstream myfile("bytearrayfile", std::ios::binary); 

Фундаментально метод, который вы будете использовать, чтобы прочитать каждую запись из файла:

uint16_t schemaId; 
uint64_t lastModifiedDate; 
uint32_t binaryLength; 

myfile.read(reinterpret_cast<char*>(&schemaId), sizeof(schemaId)); 
myfile.read(reinterpret_cast<char*>(&lastModifiedDate), sizeof(lastModifiedDate)); 
myfile.read(reinterpret_cast<char*>(&binaryLength), sizeof(binaryLength)); 

Это будет читать три статических членов ваших данных структура из файла. Поскольку ваши данные переменного размера, вы, вероятно, необходимо выделить буфер для чтения его в, например:

std::unique_ptr<char[]> binaryBuf(new char[binaryLength]); 
myfile.read(binaryBuf.get(), binaryLength); 

Выше приведены примеры только для иллюстрации, как бы вы подойти к этому в C++. Вам нужно будет знать о следующих вещах:

  • В приведенных выше примерах ошибок нет.Вам нужно будет проверить, что вызовы ifstream::read успешны и возвращают правильный объем данных.
  • Endianness может быть проблемой, в зависимости от платформы, с которой происходят данные и которые читаются.
  • Для интерпретации поля lastModifiedDate может потребоваться написать функцию для преобразования ее из любого формата, используемого Java (я понятия не имею о Java).
+0

Большое спасибо Джонатан .. высоко оценил вашу помощь по этому вопросу .. Возможно ли это для вас скомпоновать эти куски кода для меня с моим примером на C++? Поскольку я разработчик Java, потребуется несколько часов, чтобы выяснить, где добавить эти строки кода ... И что касается 'lastModifiedDate', я хотел бы читать так, как это сейчас на Java, а именно - '1379811105109' .. – AKIWEB

Смежные вопросы