Обработка байта [] с помощью ByteBuffer - PullRequest
0 голосов
/ 14 января 2011

Я пытаюсь получить доступ к байту [] через ByteBuffer, чтобы представить определенный мной тип файла.Первые позиции в байте [] содержат метаданные и обрабатываются битовыми манипуляциями.Поэтому они вообще не представляют символ.

Я хочу добавить данные файла (например, символы) в определенную фиксированную позицию.

byte[] file_portion содержит часть большого файла: начальный раздел.Который включает в себя заголовок с метаданными.content - это строка с информацией, которую я хочу добавить в этот буфер.start_pos - первая позиция для хранения новых файловых данных из содержимого.

ByteBuffer my_content = ByteBuffer.allocate(this.file_portion.length);
content_buffer.wrap(this.file_portion);

for (int i = 0; i < content.length(); i++) {
    char tmp = content.toCharArray()[i];
    my_content.put(this.start_pos + i, (byte) tmp)
}

Если я переназначу это, я получу мусор и пустоту:

CharBuffer debug = my_content.asCharBuffer();
System.out.println("debug " + debug);

Я мог бы понять, если первыйпозиции показывают поврежденные символы ... но ни одна позиция не является правильной.

Ответы [ 2 ]

2 голосов
/ 14 января 2011

Если вы добавляете символы в ByteBuffer и ожидаете, что они будут читаемы в представлении CharBuffer, вы должны использовать putChar (...), а не put (...).: за комментарии OP.

Например:

char[] chars = content.toCharArray();  // removed from loop per leonbloy's excellent comment  
CharBuffer cbuf = my_content.asCharBuffer();

for (int i = 0; i < content.length(); i++) {
    cbuf.putChar(chars[i]);
}

CharBuffer debug = my_content.asCharBuffer();
System.out.println(debug);

my_content.position(my_content.position() + 2*chars.length);

В противном случае CharBuffer считывает два ваших последовательных байта как один символ.Теперь буфер cbuf начнет загружать символы в тот же момент, когда ваш байтовый буфер остановился.После загрузки всех символов ваш оригинальный ByteBuffer будет расположен в следующем месте.Надеюсь, это то, что вы ищете.

1 голос
/ 14 января 2011

Знаете ли вы, что в Java символ занимает два байта?

...