2011-01-13 10 views
0

Я пытаюсь получить доступ к байту [] через ByteBuffer для представления определенного типа файла. Первые позиции в байте [] содержат некоторые метаданные и обрабатываются бит-манипуляциями. Таким образом, они не представляют собой символ вообще.Handle byte [] with 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

Помимо ошибки, 'content.toCharArray() [i]' является уродливым, вы выделяете новый массив символов в каждой итерации цикла. Создайте массив char вне или используйте 'content.charAt (i)' – leonbloy

ответ

2

Если вы добавляете символы в ByteBuffer и ожидаете, что их можно прочитать с помощью вида CharBuffer, вы должны использовать putChar (...) not put (...).

EDITED: по комментариям ОП.

Например:

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 будет расположен в следующем месте. Надеюсь, это то, что вы ищете.

+0

. Это .flip() выглядит очень полезно. Но мне еще нужно добавить символы в заданной позиции. Если я сделаю это с помощью my_content.setPosition (this.start_pos + i) или даже + i +1, все конвертирование будет искажено. – wishi

+1

Я предполагаю, что я пытаюсь сделать так, что вам нужно позволить Буферам сделать две вещи для вас, чтобы сделать вашу жизнь проще. 1) управлять позицией в буфере и 2) управлять форматом данных элементов, которые читаются/записываются. В вашем исходном коде вы пытаетесь сделать то и другое, и сталкиваетесь с проблемами из-за этого. –

+0

Большое спасибо за ваши усилия. Вы абсолютно правы: управлять этой позицией здесь проблематично, и я должен отделить это. Тем не менее у меня есть проблема, что cbuf заполняется из позиции 0. Мне нужно заполнить его, начиная с позиции n. Каждый раз, когда я делаю это, весь материал становится поврежденным. :( – wishi

1

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